写点什么

使用 awk 命令统计文本

作者:程序员小航
  • 2022 年 5 月 24 日
  • 本文字数:977 字

    阅读完需:约 3 分钟

2022-04-19 11:25:15.008,b4d13bfca8fe4b93a85e65a88520d945,LogScheduler#printLog,10ms,Y,xxxxxxxx2022-04-19 12:01:15.002,4d10d093dce8491c8ae3c1bff6dbd7c5,LogScheduler#printLog,999ms,N,xxxxxxxx2022-04-19 12:12:16.003,d9d1f4b121764edb8cb260417cd75229,LogScheduler#printLog,5ms,Y,xxxxxxxx2022-04-19 12:15:22.004,e3e10340e51c49ce9d688541ba799283,LogScheduler#printLog,1001ms,N,xxxxxxxx2022-04-19 12:55:59.005,209d2f1407894da5aa0f44de621515c7,LogScheduler#printLog,1020ms,Y,xxxxxxxx2022-04-19 13:25:15.006,e09f75c6d0d849068ae713820c94f3f9,LogScheduler#printLog,15ms,Y,xxxxxxxx2022-04-19 13:25:15.008,b4d13bfca8fe4b93a85e65a885231231,LogScheduler#printLog,99ms,Y,xxxxxxxx
复制代码


有那么一段日志,需要统计出来以下信息:


  • 输出耗时超过 1000ms 并且结果是 Y 的整行

  • 12:00 ~ 13:00 之间成功的行数,成功率


日志格式:时间,traceId,类方法名,耗时,结果,内容


看到这里,如果小伙伴已经有思路了,那就没必要往下面看了,直接拉到最后,点赞、在看。


这里要使用的就是 awk 命令。

常用内置变量

awk 的主要功能就是对文本进行统计报告,具体介绍可以看菜鸟笔记,下面仅介绍几个常用的内置变量。


  • FS:行字段分隔符,默认是空格,可以使用-F指定分隔符

  • 1……:行字段分隔符分割后获取指定部分,$0 是获取整行记录

  • NF:当前行的字段数量

  • RS:行记录分隔符

  • NR:行号


大概常用的就这几个,下面看一下实际使用效果

效果展示

notes  % > awk '{print $0}' c.log
复制代码


因为 $0 就代表整行记录,所以输出结果如下。



那 $1 的结果呢?



因为默认是空格作为分隔符,所以输出的结果就只有日期了。


指定分隔符为,之后,看一下输出结果:


题目答案

基本上熟悉了怎么使用剩下的就比较好办了。


  • 耗时超过 1000ms 且 Y 的行


notes  % > awk -F ',' '{split($4,a,"ms"); if(a[1] > 1000 && $5 == "Y") print $0}' c.log
复制代码



  • 12:00 ~ 13:00 之间成功的行数,成功率


awk -F ',' 'BEGIN{count=0;sum=0}{if($1>="2022-04-19 12:00:00.000" && $1<"2022-04-19 13:00:00.000"){sum+=1;if($5 == "Y")count+=1}}END{print NR,count,sum,count/sum}' c.log
复制代码



总记录 7 条, 12:00 ~ 13:00 之间成功的行数是 2,成功率 0.5。

总结

上面只是在工作中可能会遇到的一个场景,所以记录下来,如果小伙伴有更合适的方式来统计计算,欢迎留言。

发布于: 刚刚阅读数: 3
用户头像

个人公众号:『 程序员小航 』 2020.07.30 加入

某不知名互联网公司 Java 程序员一枚。记录工作学习中的技术、开发及源码笔记;分享生活中的见闻感悟。

评论

发布
暂无评论
使用 awk 命令统计文本_后端_程序员小航_InfoQ写作社区