首页 > 系统相关 >Linux系列之统计某个字符串出现次数并排序

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

时间:2024-03-26 18:04:42浏览次数:29  
标签:sort catalina grep cat awk Linux 字符串 排序 统计

业务场景

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

项目环境

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

实验步骤

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

cat catalina.out.2024-03-26| grep "/api/get"| wc -l

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

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命令
cat catalina.out.2024-03-26
  • 筛选出具体的api接口
cat catalina.out.2024-03-26| grep "/api/get"
  • 筛选请求json字符串对应设备号的value值
    首选,我们请求参数是一串json字符串,假如是这样的:
{ "code", "0B403940FF289695FC093BF2556FFD75", "type":1}

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

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($i~"code"){print $(i+1)} }}:遍历筛选出来的数据,匹配到code打印出对应的value

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

"0B403940FF289695FC093BF2556FFD75"
"0B403940FF289695FC093BF2556FFD76"
....

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

tr -d '"'

打印:

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

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

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

....

总结归纳

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

 awk -F '(param=)' '{print $2}'

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

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

标签:sort,catalina,grep,cat,awk,Linux,字符串,排序,统计
From: https://blog.csdn.net/u014427391/article/details/137050418

相关文章

  • 字符串 hash
    (由于字符串hash和整数hash是两个东西,以下将字符串hash称作strash)前情提要:strash:我来!(非常好数据,使我的strashWA掉)strash是什么?strash有什么用?该如何避免上述情况?strash是什么strash的原理其实很简单:将一个字符串当作\(b\)进制数。Soyouwroteawrongcod......
  • windows/Linux 防火墙安装配置规则
    现阶段常见的防火墙属于具有安全操作系统的防火墙,例如:NETEYE、NETSVREEN、TALENTIT等。防火墙的基本类型一、网络层防火墙←网络层防火墙可视为一种IP封包过滤器,运作在底层的TCP/IP协议堆栈上。可以以枚举的方式只允许符合特定规则的封包通过,其余的一概禁止穿越防火墙(病毒除......
  • 2. Linux常用命令
    学习目的Linux下有非常丰富的命令,可以用来完成大部分重要的Linux服务器操作维护功能,而且至今有些功能仍然通过命令操作比较方便。实际工作中,大量服务器维护工作都是工程师通过远程控制来完成的,并没有图形界面,这时维护工作都需要通过命令来完成。作为后端工程师,我们将来......
  • Linux V4l2简单使用
    V4L2:VideoforLinuxtwo,缩写Video4Linux2,是Linux内核中的一个框架,提供了一套用于视频设备驱动程序开发的API。它是一个开放的、通用的、模块化的视频设备驱动程序框架,允许Linux操作系统和应用程序与各种视频设备(如摄像头、视频采集卡等)进行交互。V4L2提供了通用的API,使......
  • Linux Mint下Qt Creator无法输入中文解决办法
    ubuntu下有对应的fcitx-frontend-qt6软件包,直接安装就能解决问题。但是linuxmint只有基于qt5的,目前使用Qtonlineinstaller安装的QtCreator是基于Qt6.6编译的所以,只能自己编译对应的fcitx-frontend-qt6动态库,然后放到对应目录下首先下载对应的源码gitclonehttps://github......
  • js使用正则从字符串中取出img标签
    要使用正则表达式从字符串中提取<img>标签,您可以使用以下代码:conststr=`Sometext<imgsrc="image.jpg"alt="Image">andmoretext<imgsrc="another.png"alt="Another">`;constregex=/<img[^>]*>/g;constimgTags......
  • linux添加目录到环境变量中
    步骤一、/etc/profile文件进入编辑模式执行如下命令让/etc/profile文件进入编辑模式。sudovim/etc/profile步骤二、添加内容在文件的最后一行添加如下内容:PATH=$PATH:/home/fenglv/software/installed/bin/其中/home/fenglv/software/installed/bin/为要添加的目录,如2-2......
  • 字符串中的第一个唯一字符
    题目:给定一个字符串s,找到它的第一个不重复的字符,返回它的索引 。如果不存在,则返回-1。代码:classSolution{public:intfirstUniqChar(strings){intsize=s.size();intindex=-1;//用unordered_map集合存取键值对unorder......
  • Linux调试小技巧总结
    1如果你是release运行时出问题,很难复现请,参考我的这篇博客,在编译之初做好准备  https://www.cnblogs.com/8335IT/p/18079295  linux上编译release并剥离调试信息  配合gdbattachpid/c/breakXXX.cpp:lineNo./s/n/pstack等在线调试(root)2如果你是测试过程中发现crash......
  • Linux常用命令介绍
    Linux常用命令介绍Linux中的命令非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了。因为不想在使用时总是东查西找,所以在此总结一下,方便一下以后的查看。下面就说说我最常用的Linux命令。1、cd命令这是一......