5个例子征服awk
awk是非常实用的文本处理工具,我们试图用5个例子了解awk的基本用法
基本用法:awk BEGIN{扫描前执行的操作} '匹配模式{执行的操作}' END{扫描后执行的操作}
其中,BEGIN{扫描前执行的操作}和END{扫描后执行的操作}不是必须的
例子1:netstat -alepn | awk '$1=="tcp" && $6=="LISTEN"'
解释:通过管道获得netstat -alepn命令的输出,扫描每行文本,判断该行的第1列是否为‘tcp’ 以及第6列是否为‘listen’,若是则该行匹配成功,扫描完后输出所有匹配成功的行
例子2: netstat -alepn | awk '$1=="tcp" && $6=="LISTEN"{print $4}'
解释:通过管道获得netstat -alepn命令的输出,扫描每行文本,判断该行的第1列是否为‘tcp’ 以及第6列是否为‘listen’,若是则该行匹配成功,最后打印所有匹配成功的行的第4列
例子3: netstat -alepn | awk '$6 ~/LISTEN|WAIT/{print $4}'
解释:匹配模式另一种写法
例子4:netstat -alepn | awk 'BEGIN{print "protcol status"}$6 ~/LISTEN|WAIT/{print $1, $6}'
解释:第一行输出protcol status 再输出匹配行的指定列
例子5: ls -l *.c |awk '{sum+=$5} END{print sum}'
解释:获得当前路径下所有.c文件的大小累加并打印总大小
另外:
上面例子中的输入文件都是来自管道,其实也可以来自指定文件
比如:awk '$1=="tcp" && $6=="LISTEN"' test.log
扫描的文件是来自当前路径下的test.log文件
还有,awk分割列的时候默认采用的是空格符或者tab
还可以通过-F 分割符的方式指定特殊的分割符
比如:awk -F: '$1=="tcp" && $6=="LISTEN"' test.log
采用:作为列的分割符