好记性不如烂笔头(awk简单使用)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aazhoukeaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值