赞
踩
最近遇到一个流量异常调用的接口,所以需要通过后台日志查看接口调用情况,先统计今天内接口的调用次数,再具体到对应的设备号,就知道哪台设备有问题了,初步想到wc
和awk
命令来筛选统计,但是真正去写的时候,发现很多写法都不太记得了,所以花了点时间去查手册,找资料,现在整理成博客,方便以后需要就马上统计出来,也分享出来,希望可以帮助需要的人
统计某个接口调用次数,可以通过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
不熟悉的读者看起来有点懵,所以,一点点分析一下,为什么这样写?
catalina.out
日志文件,使用cat
命令cat catalina.out.2024-03-26
cat catalina.out.2024-03-26| grep "/api/get"
{ "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对应参数
awk -F "[,:}]"
:按照中括号中的内容,}:
依次分割字符串{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
....
-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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。