首页 > 技术文章 > 5个例子征服awk

jiage666 2020-08-15 18:35 原文

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

采用:作为列的分割符

 

推荐阅读