awk其实可以看做是在shell中运行的独立程序,shell中获取的"行为单位的数据"传入awk中,每行做重复的进一步处理:
如:ls -all | awk ‘{print $1}’ 表示对当前目录使用了ls -all,该linux命令会显示n行的信息,这n行数据会传入awk中,然后每行都会执行一次{print $1}内容。这就是awk的基本工作原理,更详细的你查书吧,还有些BEGIN、END啥的都可以省略。
实际例子1:(删除linux当前的所有队列)
ipcs -q | awk '/0x/ {print "ipcrm -q ",$2}' | sh
其中的‘/0x/’是pattern匹配符,表示如果该行中有0x字符才会运行一次awk的行处理程序,正则式。
接着的{print "ipcrm -q ",$2}' | sh,原本只有{print "ipcrm -q ",$2}' 就是输出ipcrm -q 加上每行的$2(第二个字符串字段内容,所谓字段就是空格隔开的字符串),现在接了|sh,表示ipcrm -q 加上每行的$2(第二个字符串字段内容),这些内容再次当做脚本执行一次,这里具体也就删除了一个队列(如ipcrm -q 0x123456)。
实际例子2:(当目标文件/opt/log_data.txt的大小超过60000byte时,删除)
ls -all /opt/log_data.txt | awk '{if($5 >= 60000) print "rm -rf /opt/log_data.txt"}' | sh
其中awk的行变量$5是文件的大小,awk行代码的($5 >= 60000)这么比较,是比较的字符串还是数值大小,我也不知道,反正这么比较目前的结果的确是在比较数值的大小,最终一样将awk的print内容返回脚本执行,即|sh
实际例子3:(ifconfig 指令返回数据众多,我只要inet6的prefixlen)
ifconfig | grep inet6 | awk 'BEGIN{print "start"} {if ($3=="prefixlen") print $4} END{print "end"}'
获取两个网卡,一个64,一个128
和grep结合比较常见,因为在实际的脚本中,往往需要使用ifconfig这种系统shell指令,但有只是需要部分返回数据,如这里的prefixlen,于是先grep,过滤一下,获取目标行,然后行传入awk中进行分析处理 ,例子1中的/0x/叫做pattern就是匹配符,正则表达式匹配符,实在不好看,还是用grep过滤目标行合适。
实际例子4:
a:如果awk行操作pattern{commands}的commands不止一个指令则使用“;”连接。
b:若commands存在if判断执行,执行也为多个指令,则if (){command1;command2;command3},使用"{}"将命令组合,这很c。
实际例子5:
shell和awk的变量互传方式,实际脚本中的变量也希望能进入awk中,或者shell需要awk中的数据才能决定if执行condition,这很现实常见。
shell变量数据传入awk
awk变量数据返回shell
后期有这么几个地方需要补充:
2:awk的行条件过滤还是不错的,记录一些
3:追加|sh的意义,我看到还有些shell中有追加|read xxx