awk高级企业级使用案例
一、背景:
以某物联网企业,传感器设备实时数据消费服务(Kafka-consumer)为例,调试筛选处理耗时的主题。
二、实战应用
1.1 【案例1】 (使用tail+awk来提取日志中的数值数据,按数值范围过滤):
原始日志格式(示例):
2018-07-11 11:49:22.413 INFO 29244 --- [TW_safeclound_elec_line_v-1531280885818] c.s.s.s.l.TimeoutInvokeMethodAspect : 消费处理耗时: 10148 ms, method=ConsumerElecLineVDataListener.lineVData(..), args={"addr":"11111118","bid":"QQBE","cid":"BLWY","dataType":"ELE_R_LV","id":"11111118,85,117,ELE_R_LV,1531280962413","lineAB":396.77,"lineBC":395.75,"lineCA":396.42,"meterType":"117","order":"85","timestamp":1531280951758}
1.2 实战操作(我们就想提取“耗时”紧跟着的毫秒数,然后要过滤在大于10小于500范围内的):
[root@web-prod ~]# tail -f /mnt/disk1/sink/logs/sink.log|grep 耗时| awk -F ' ' '$10>200 && $10<500{print $1,$2,$6,$10,$11}'
2018-07-14 22:59:40.163 [TW_safeclound_largestDemand-1531512341755] 441 ms,
2018-07-14 22:59:40.516 [TW_safeclound_rate_v-1531512332686] 363 ms,
2018-07-14 22:59:40.665 [TW_safeclound_rate_i-1531512317893] 375 ms,
2018-07-14 22:59:40.866 [TW_safeclound_water-1531512518874] 332 ms,
...
1.3 注释:
a. 其中 awk的 -F 参数表示:日志字符串分隔符,默认为 ' ' 空格;
b. $10>100 表示我要筛选耗时大于 100 毫秒的日志;
c. {print $1,$2,$6,$10,$11} 表示打印被awk分隔后的 第1段(日期)、第2段(时间)、第6段(主题)、第10段(耗时)、第11段字符串(耗时单位);
d. 其中 $10>200 && $10<500 表示我要筛选耗时在200~500之前的消费主题;
2.1 【案例2】 (netstat+awk实现统计Linux当前TCP活跃连接的重复次数)
netstat原标准输出格式(示例):
tcp 0 0 112.215.174.131:8782 117.132.197.188:11056 ESTABLISHED off (0.00/0/0)
tcp 0 0 112.215.174.131:8782 117.132.197.188:11056 ESTABLISHED off (0.00/0/0)
....
2.2 实战操作:
[root@old-collect ~]# netstat -anop|grep ESTABLISHED|grep 8782|awk '{print $5}'|awk -F ':' '{print $1}'| awk '{a[$1]++}END{for(i in a){print i,a[i]|"sort -r -g -k2"}}'
2.2 注释:
a. 第一次awk '{print $5}' 表示使用默认“空格”分隔,获取第5列(即:客户端ip:port);
b. 第二次awk -F ':' '{print $1}' 表示指定使用“冒号”分隔,获取第1列(即:客户端ip);
c. 第三次awk '{a[$1]++}END{for(i in a){print i,a[i] | "sort -r -g -k2"}}' ,这才是真正分组统计,即:将客户端ip不停累加,然后输出累加得到数组值,最后使用 sort -r -g -k 2 可将结果按照第2列来排序,也就是重复的次数(其中-r表示倒序,这里一定要加-g表示按常规数值排序,否则会出排序出奇怪的结果,具体请查阅shell sort -k排序之坑相关文章,大致原因是因为sort -k分隔的问题 按ascii排的)。