格式化输出
awk提供两个高级输出函数printf和sprintf,他们提供了格式化输出功能。
– printf函数将格式化字符串打印到标准输出(stdout)
– sprintf 函数则返回“可以赋值给变量的字符串”
eg.
print.awk
# printf & sprintf
{
# 第一个字段
x = $1
b ="foo"
# 格式化输出
printf("%s got a %d on last test\n","Jim",83)
# 将格式化的字符串赋给变量
myout = sprintf("%s - %d", b, x)
# 简单输出,自带换行
print myout
}
echo 100| awk -f print.awk
Jim got a 83 on last test foo - 100
格式化输出支持的转义字符(格式说明符)
c ACII字符(char型)
s 字符串
d 十进制整数
ld 十进制长整形
u 十进制无符号整数
lu 十进制无符号长整数
x 十六进制整数
lx 十六进制长整数
o 八进制整数
lo 八进制长整数
e 用科学计数法表示的浮点数
f 浮点数
g 选e/f中较短的一种
awk还支持一些修饰符,这些修饰符跟在‘%’后面,出现在格式说明符之前,可以规定输出域的宽度和对齐方式。
printf的修饰符
- 左对齐修饰符
# 显示8进制数时在前面加个0;16进制数时在前面加个0x
+ 显示使用的d、e、f、g格式的整数时,前面加上正负号(+/-)
0 用0而不是空白来填充所显示的值
格式说明符和修饰符的使用方法:
%-width.precision format-specifier
eg.
%10s // 默认右对齐; 10:输出字段的域长度至少10个字符,不够10个,空白补齐;多余10个时,原样输出
%-10s // 同上,– 表示输出左对齐
%10.5f // 字段输出至少10个字符宽度;5-小数点后5位
字符串函数
1. 子字符串查找
index(str,subsr) 返回子串subsr在串str中第一次出现的索引(起始位置),index函数字符串的开始位置为1.(C语言为0)
2. 子字符串提取
substr(str,position[,length]) 返回str中position位置开始的length个字符;缺省length时,返回positio位置开始的所有字符。
eg.
awk ‘{print substr($1,3)}’ // 提取第一个域中从第三个字符起的所有字符
awk ‘{print substr($1,5,9)}’ // 提取第一个域中从第5个字符起的后面9个字符
3. 字符串匹配
match(string,/regexp/) 如果在string中找到匹配正则/regexp/的子字符串,则返回子字符串的起始位置,无法匹配,则返回0
区别: index()函数查找固定字符串的位置,match()支持正则匹配!
match()函数会影响两个系统变量:
RSTART :运行match()后,被设置为匹配上正则表达式的子字符串的起始位置。
RLENGTH:运行match()后,被设置为匹配上正则表达式的子字符串的长度。
若无法匹配,RSTART被设置为0,RLENGTH被设置为-1。
4. 子字符串替换
sub(regexp,replacement,target)
将target与正则表达式regrxp进行匹配,只替换匹配到的第一个字符串;如果target没有给定,则sub函数默认使用整个记录。
gsub(regexp,replacement,target)
// gsub()函数替换所有匹配到的字符串
5.大小写转换
tolower(string) 将输入文本转为小写
toupper(string) 将输入文本转为大写
6. 字符串分割
split(string,array,regexp)字符串分割函数
将string切割为片段,并存储到数组里,分割字符串时的分隔符由正则regexp指定,省略regexp时默认为FS(空格).
eg.1
[root@web1 test]# cat split.awk
# awk 字符串分隔函数
{
print "\nField seperator = FS \" "FS" \""
n = split($0, array) // 默认使用 空格 为字段分隔符
for(k =1; k <= n; k++) // split函数返回分割后的字符串的个数
{
print "array[k] = " array[k]
}
}
[root@web1 test]# echo "dfssfs sdf dsf dsf "| awk -f split.awk
Field seperator = FS " "
array[k]= dfssfs
array[k]= sdf
array[k]= dsf
array[k]= dsf
eg.2
[root@web1 test]# cat split.awk
# awk 字符串分隔函数
{
print "\nField seperator = :"
n = split($0, array,":") // 指定分隔符为 ":"
for(k =1; k <= n; k++)
{
print "array[k] = " array[k]
}
}
[root@web1 test]# head -n2 /etc/passwd | awk -f split.awk
Field seperator =:
array[k]= root
array[k]= x
array[k]=0
array[k]=0
array[k]= root
array[k]=/root
array[k]=/bin/bash
Field seperator =:
array[k]= bin
array[k]= x
array[k]=1
array[k]=1
array[k]= bin
array[k]=/bin
array[k]=/sbin/nologin
split(“”,array) // 快速清空数组
7. 字符串重建
eg.1
[root@web1 test]# awk 'BEGIN{ s1 = "hello "; s2 = "ollir "; s = s1 s2 ; print s}'
hello ollir
[root@web1 test]# awk 'BEGIN{ s1 = "hello "; s2 = "ollir "; s = sprintf("%s%s",s1 ,s2); print s}'
hello ollir
算术函数
1.常用函数
三角函数sin()、cos() // 输入参数为弧度角,不是30°之类的角度,要转化为弧度
atan(x,y) // x,y范围内的余切
exp(x) // 以e为底数的指数
log() // 自然对数
sqrt() // 平方根
2.取整函数
int() 取实型数字的整数部分,直接忽略小数部分
eg.
print int(10.6)
10
3.随机数
rand() 生成一个0-1之间的浮点型随机数
srand(x)为随机数发生器设置一个种子,种子数值为x,如果x未传入参数,则srand()函数将当前时间作为种子。
如果没有调用srand()来设置随机种子的话,awk在开始执行程序前默认以某个常量作为参数调用srand(),使得程序每次运行时都以同一个随机种子开始,这样使得所得的随机数序列每次运行都相同,这可以用于重复测试相同的操作。
eg.
[root@web1 test]# cat rand.awk
BEGIN {
# 没有显式调用srand()设置种子,awk使用默认常量作为参数传入srand()设置固定的种子
print rand() // 随机数固定
print rand()
# srand()使用当前时间作为参数上设置种子
srand()
print rand() //随机数与当前时间有关
print rand()
}
{}
[root@web1 test]# echo ""| awk -f rand.awk
0.237788
0.291066
0.0421086
0.447394
[root@web1 test]# echo ""| awk -f rand.awk
0.237788
0.291066
0.874176
0.562551
Linux常用命令之awk http://www.linuxidc.com/Linux/2016-09/135046.htm
Linux系统之文本格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm
AWK简介及使用实例 http://www.linuxidc.com/Linux/2013-12/93519.htm
Linux awk文本分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm
Linux文本处理工具之awk http://www.linuxidc.com/Linux/2015-01/111437.htm
如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm
文本分析工具-awk http://www.linuxidc.com/Linux/2014-12/110939.htm
AWK入门基础教程 http://www.linuxidc.com/Linux/2016-12/138138.htm
使用awk格式化输出文本 http://www.linuxidc.com/Linux/2016-04/130193.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/139373.htm