awk 简介
整体来说, a w k是所有s h e l l过滤工具中最难掌握的,不知道为什么,也许是其复杂的语法或含义不明确的错误提示信息。在学习a w k语言过程中,就会慢慢掌握诸如Bailing out 和a w k : c m d . L i n e :等错误信息。
可以说a w k是一种自解释的编程语言,之所以要在s h e l l中使用a w k是因为a w k本身是学习的好例子,但结合a w k与其他工具诸如g r e p和s e d,将会使s h e l l编程更加容易。
awk是必须熟练掌握的命令之一。
awk 调用方式
有三种方式调用a w k,第一种是命令行方式,如:
awk [-F field-seperator] ‘commands’ input-file(s)
这里,c o m m a n d s是真正的a w k命令。一般使用这种调用方法。
第二种方法是将所有a w k命令插入一个文件,并使a w k程序可执行,然后用a w k命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的a w k命令插入一个单独文件,然后调用:
awk 域和记录
示例文件:
$ cat bill.vc
0 system_type 0 1 2 0 * * * 业务类型
1 msisdn 2 16 0 * * * 手机号码
2 other_party 17 40 0 * * * 对端号码
3 start_datetime 41 53 0 * * * 通话时间
a w k执行时,其浏览域标记为$ 1,$ 2 . . . $ n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。awk使用-F选项来指定域分割符,如-F “|”,表示以|作为分割符,默认分隔符为空格。上例中的,第一列就是$1,第二列是$2,$0表示整行记录。
范例
awk ‘{print $1,$3}’ bill.vc
awk ‘{print $0}’ *.vc
awk 条件操作符
操作符描述操作符描述
< 小于
> = 大于等于
< = 小于等于
~ 匹配正则表达式
= = 等于
!~ 不匹配正则表达式
!= 不等于
awk 语句举例
awk ‘{if($2~/msisdn/) print $0}’ bill.vc
对于bill.vc文件,如果第2个域含有msisdn则输出整行记录。
awk ‘{if($1<=1) printf(“%-20.20s:%d\n”,$2,$4);}’ bill.vc
如果第一个字段的值小于或等于1,则格式化输出第2和第4个域
awk ‘BEGIN{total=0;}{if($1>0) total+=$4}END{print “total=“total}’ bill.vc
说明:
BEGIN:在遍历整个文件之前,将total置为0
第二部分的{}是一条if语句,符合条件则修改total的值
END:在遍历完整个文件之后,输出total的值。注意这里引号括起来表示为常量字符串.
awk 内置变量
FS 域分隔符
NF 域数
NR 记录数
FILENAME 输入的文件名
OFS 输出域分隔符
…
awk 内置函数
s p l i t ( s , a , f s ) 在f s上将s分成序列a
echo “a,b,c”|awk ‘{split($0,destArry,’,’);print destArry[1], destArry[2], destArry[3]}’
l e n g t h ( s ) 返回s长度
echo “a,b,c”|awk ‘{print length($0)}’
i n d e x ( s , t ) 返回s中字符串t的第一位置
echo “a,b,c”|awk ‘{print index($0,”,”)}’
s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分
echo “a,b,c”|awk ‘{print substr($0,3)}’
s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分
echo “a,b,c”|awk ‘{print substr($0,3,1)}’
…