常用shell awk统计

awk是一个linux中强大的文本分析工具,很多时候我们需要对应用日志进行分析,它就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk的语法

awk 后面没有BEGIN和END,跟着的是pattern,也就是每一行都会经过这个命令

  • $0 当前记录(这个变量中存放着整个行的内容)
  • $1~$n 当前记录的第n个字段,字段间由FS分隔
  • FS 输入字段分隔符 默认是空格或Tab
  • NF 当前记录中的字段个数,就是有多少列
  • NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
  • FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
  • RS 输入的记录分隔符, 默认为换行符
  • OFS 输出字段分隔符, 默认也是空格
  • ORS 输出的记录分隔符,默认为换行符
  • FILENAME 当前输入文件的名字

变量

除了awk的内置变量,awk还可以自定义变量。

语句

awk中的条件语句是从C语言中借鉴来的,而循环语句支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。

数组

awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。

#打印每一行的第一列
ls -lh | awk '{print $1}'  
#打印每一行的行数
ls -lh | awk '{print NR " " $1}'
#引入变量sum,统计py文件的大小
ls -l  *.py | awk '{sum+=$5} END {print sum}'
#使用数组,统计重复出现的次数
awk '{sum[$2]+=1}END{for(i in sum)print i"\t"sum[i]}' test.txt

#统计全部行数
#| 为shell中的管道符,把第一个命令的结果作为第二个命令的输入
#uniq -u,仅显示不重复出现的行
#sort -n 按照数值的大小排序,-r:以相反的顺序来排序,-k:按照哪一列进行排序
#wc -l 统计行数
awk '{print $1}' ip.log |sort -n |uniq -u |wc -l > ip_sum.log

下面演示一个完整的例子

有日志文件trace.log,内容如下:

2019-5-10 14:00:00|1|getById|1|success|
2019-5-10 03:01:00|2|getById|100|fail|
2019-5-10 02:00:00|3|getById|1000|success|
2019-5-10 02:00:00|4|updateById|1000|success|
2019-5-10 02:00:00|5|getById|1000|success|
2019-5-10 02:00:00|6|updateById|200|success|
2019-5-10 14:56:00|7|updateById|20|success|
2019-5-10 02:00:00|8|updateById|60|fail|
2019-5-10 03:00:00|9|updateById|200|success|
2019-5-10 02:02:00|10|updateById|20|success|
2019-5-11 03:02:00|11|insert|20|success|

#执行结果大于200ms的记录
awk -F "|" '{if($4>=200){print $1" "$2" "$3" "$4 }}' trace.log
#2019-5-11 日接口数量排行前3
awk '/2019-5-11/' trace.log |awk -F "|"	 '{print $3}'  |sort|uniq -c|sort -rn| head -3
#对于各个接口的执行时间ms按照(0-50,50-100,100-300,300以上)范围进行数量统计
awk -F "|" '{totalCnt[$3]++;if($4<=50){ms50[$3]++};if($4>50 && $4<=100){ms100[$3]++};if($4>100 && $4<=300){ms300[$3]++};if($4>300){ms300b[$3]++}}END{for(i in totalCnt)print i,int(ms50[i]),int(ms100[i]),int(ms300[i]),int(ms300b[i])}' trace.log
#查询trace.log文件各个接口的失败率
awk -F "|" '{totalCnt[$3]++;if($5=="fail"){failCnt[$3]++}}END{for(i in totalCnt)print i,(failCnt[i]/totalCnt[i])*100"%"}' trace.log
#查询trace.log各个接口的平均耗时
awk -F "|" '{totalCnt[$3]++;{rtSum[$3]+=$4}}END{for(i in totalCnt)print i,(rtSum[i]/totalCnt[i])}' trace.log

参阅资料

Linux awk 命令

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值