语法:awk [参数] ' pattern {action} ' [待处理文件名]
AWK的实质是根据“pattern”来匹配 文件中的行,然后执行“action”。这个很灵活,不只是匹配,还能做相应的操作,如把原文件按需要格式重新展示、做统计等等。
1、可以将AWK命令后的执行部分另外写入一个文件中,然后通过-f选项调用,如下,awkscr就是执行脚本
[root@v-linux testAWK]#awk -f awkscr test
2、AWK认为输入是有规律的,将一行看作一条记录,空格或制表符看作字段间的分割,通过$符号调用各字段,如:$1表示第一个字段,$2表示第二个字段,而$0表示整行。
[root@v-linux testAWK]#awk ‘{print $2,$1,$3}’ names
3、上例中,print后的各参数见用逗号隔开,那么输出结果中,各字段间默认用空格分割。当然,我们也可以定义输出分隔符。
在脚本中使用内置变量FS来定义输入分隔符。常用内置变量:
FS:输入分隔符,自定义以什么来分割同一行(也称作记录)中的各域(即字段)。
OFS:输出分隔符,自定义输出结果各域间的分隔,默认以空格分隔
NF:记录中域的个数,$NF等价于取最后一个域。
RS:记录分隔符,自定义各记录间的分隔,默认是换行符
ORS:输出结果中的记录分隔符,自定义输出结果中记录间的分隔,默认也是换行符
NR:awk从运行起到当前读取的行号,如果处理多个文件,这个NR值是累加的
FNR:当前读取的行号,如果处理多个文件,对每一个文件,FNR的值都是重新置零的。
4、BEGIN和END:
在Unix awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。
任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。
例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):
$awk
'BEGIN {FS=":";print "统计销售金额";total=0}
{print$3;total=total+$3;}
END {printf "销售金额总计:%.2f",total}' sx
在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描之前显示出输出行头。而END则在扫描完成后打印出总合计。
注:如果使用了BEGIN,还想使用模式匹配记录,需要将匹配记录的模式写到BEGIN段之后。如:
$awk
'BEGIN {FS=":"}
/^a/{print $2 }' names
/^a/这个匹配模式要放到文中的位置。