前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux系列之统计某个字符串出现次数并排序

Linux系列之统计某个字符串出现次数并排序

作者头像
SmileNicky
发布2024-05-24 13:48:16
360
发布2024-05-24 13:48:16
举报
文章被收录于专栏:Nicky's blogNicky's blog

业务场景

最近遇到一个流量异常调用的接口,所以需要通过后台日志查看接口调用情况,先统计今天内接口的调用次数,再具体到对应的设备号,就知道哪台设备有问题了,初步想到wcawk命令来筛选统计,但是真正去写的时候,发现很多写法都不太记得了,所以花了点时间去查手册,找资料,现在整理成博客,方便以后需要就马上统计出来,也分享出来,希望可以帮助需要的人

项目环境

  • JDK1.8.0_111-b14
  • Linux3.10.0-1062.el7.x86_64
  • Apache Tomcat/8.5.85

实验步骤

统计某个接口调用次数,可以通过grep筛选出对应得到接口,然后加上wc统计出调用次数

代码语言:javascript
复制
cat catalina.out.2024-03-26| grep "/api/get"| wc -l

如果要统计这个接口具体是哪个设备调用的,每个设备具体的调用次数,就稍微有点麻烦,因为接口请求后,会有一个请求参数,一般是json传参的,所以思路是先用grep定位到具体的接口,然后解析传参json字符串,获取设备号code,对应的值value,然后使用uniq加上sort统计出这个设备调用的次数,具体的linux命令是:

代码语言:javascript
复制
cat catalina.out.2024-03-26| grep "/api/get"| awk -F "[,:}]" '{for(i=1;i<=NF;i++){if($i~"code"){print $(i+1)} }}' | tr -d '"'| sort | uniq -c | sort -nr

不熟悉的读者看起来有点懵,所以,一点点分析一下,为什么这样写?

  • 查看日志 因为是tomcat部署的后端服务,所以要查看tomcat的catalina.out日志文件,使用cat命令
代码语言:javascript
复制
cat catalina.out.2024-03-26
  • 筛选出具体的api接口
代码语言:javascript
复制
cat catalina.out.2024-03-26| grep "/api/get"
  • 筛选请求json字符串对应设备号的value值 首选,我们请求参数是一串json字符串,假如是这样的:
代码语言:javascript
复制
{ "code", "0B403940FF289695FC093BF2556FFD75", "type":1}

所以需要获取json对应key,也就是我们的设备号code,对应的值0B403940FF289695FC093BF2556FFD75

代码语言:javascript
复制
cat catalina.out.2024-03-26| grep "/api/get" | awk -F "[,:}]" '{for(i=1;i<=NF;i++){if($i~"code"){print $(i+1)} }}'

解释一下awk对应参数

  1. awk -F "[,:}]" :按照中括号中的内容,}:依次分割字符串
  2. {for(i=1;i<=NF;i++){if(

通过上面的linux命令,打印出来的是

代码语言:javascript
复制
"0B403940FF289695FC093BF2556FFD75"
"0B403940FF289695FC093BF2556FFD76"
....

如果觉得比较别扭,可以去掉"字符,使用命令

代码语言:javascript
复制
tr -d '"'

打印:

代码语言:javascript
复制
0B403940FF289695FC093BF2556FFD75
0B403940FF289695FC093BF2556FFD76
....
  • 统计字符串出现的次数 统计字符串重复次数,可以使用uniq -c,然后为什么还要在前面加上sort命令?因为uniq这个命令只能统计连续的的重复行。所以需要结合sort命令使用,先sort排序,然后uniq统计重复的行
代码语言:javascript
复制
sort | uniq -c

打印,可以看出可以统计数量了,但是,没排序

代码语言:javascript
复制
1000 0B403940FF289695FC093BF2556FFD75
1001 0B403940FF289695FC093BF2556FFD76
999 0B403940FF289695FC093BF2556FFD77
....
  • 按照调用次数进行倒序 sort命令的-n表示按照数值排序,-r表示按照数值降序排序,所以需要加上排序命令
代码语言:javascript
复制
sort -nr
代码语言:javascript
复制
999 0B403940FF289695FC093BF2556FFD77
1000 0B403940FF289695FC093BF2556FFD75
1001 0B403940FF289695FC093BF2556FFD76

....

总结归纳

如果遇到param=0b33131等等这样传参的可以使用如下命令进行筛选,意思是使用param=作为分隔符

代码语言:javascript
复制
 awk -F '(param=)' '{print $2}'

如果遇到和本文类似的场景,直接使用命令进行统计即可:

代码语言:javascript
复制
cat catalina.out.2024-03-26| grep "/api/get"| awk -F "[,:}]" '{for(i=1;i<=NF;i++){if($i~"code"){print $(i+1)} }}' | tr -d '"'| sort | uniq -c | sort -nr
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 业务场景
  • 项目环境
  • 实验步骤
  • 总结归纳
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档