awk 介绍
1. 先上例子
cat test.log |sort |awk ' BEGIN{m="";} { if(m=="" || m!=$1){m=$1; print $1;} } ' |wc -l
2. 解释例子
2.1 cat 查阅test.log内容
2.2 |sort 对test.log的内容进行排序
2.3 |awk '...' 执行awk去重(稍后详述)
2.4 |wc -l 统计结果行数
2.5
BEGIN{m="";} 初始化代码块; 声明了变量m为空值。
2.6
{ if(m=="" || m!=$1){m=$1; print $1;} }
{}称为执行体。
如果m为空或者m不等于当前行的值,则把当前行的值给m,然后输出当前行。
由于是排序的,所以下一行跟上一行比较,自然达到了去重的效果。
3. 模块解释
BEGIN模块
BEGIN模块后紧跟着动作块,这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS,RS和FS等,以及打印标题。如:$ awk 'BEGIN{FS=":"; OFS="\t"; ORS="\n\n"}{print $1,$2,$3} test。上式表示,在处理输入文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个换行符。$ awk 'BEGIN{print "TITLE TEST"}只打印标题。
END模块
END不匹配任何的输入文件,但是执行动作块中的所有动作,它在整个输入文件处理完成后被执行。如$ awk 'END{print "The number of records is" NR}' test,上式将打印所有被处理的记录数。
参阅资料: