Linux統(tǒng)計(jì)某個(gè)字符串出現(xiàn)次數(shù)并排序的實(shí)現(xiàn)步驟
業(yè)務(wù)場(chǎng)景
最近遇到一個(gè)流量異常調(diào)用的接口,所以需要通過后臺(tái)日志查看接口調(diào)用情況,先統(tǒng)計(jì)今天內(nèi)接口的調(diào)用次數(shù),再具體到對(duì)應(yīng)的設(shè)備號(hào),就知道哪臺(tái)設(shè)備有問題了,初步想到wc和awk命令來篩選統(tǒng)計(jì),但是真正去寫的時(shí)候,發(fā)現(xiàn)很多寫法都不太記得了,所以花了點(diǎn)時(shí)間去查手冊(cè),找資料,現(xiàn)在整理成博客,方便以后需要就馬上統(tǒng)計(jì)出來,也分享出來,希望可以幫助需要的人
項(xiàng)目環(huán)境
- JDK1.8.0_111-b14
- Linux3.10.0-1062.el7.x86_64
- Apache Tomcat/8.5.85
實(shí)驗(yàn)步驟
統(tǒng)計(jì)某個(gè)接口調(diào)用次數(shù),可以通過grep
篩選出對(duì)應(yīng)得到接口,然后加上wc
統(tǒng)計(jì)出調(diào)用次數(shù)
cat catalina.out.2024-03-26| grep "/api/get"| wc -l
如果要統(tǒng)計(jì)這個(gè)接口具體是哪個(gè)設(shè)備調(diào)用的,每個(gè)設(shè)備具體的調(diào)用次數(shù),就稍微有點(diǎn)麻煩,因?yàn)榻涌谡?qǐng)求后,會(huì)有一個(gè)請(qǐng)求參數(shù),一般是json傳參的,所以思路是先用grep定位到具體的接口,然后解析傳參json字符串,獲取設(shè)備號(hào)code,對(duì)應(yīng)的值value,然后使用uniq加上sort統(tǒng)計(jì)出這個(gè)設(shè)備調(diào)用的次數(shù),具體的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
不熟悉的讀者看起來有點(diǎn)懵,所以,一點(diǎn)點(diǎn)分析一下,為什么這樣寫?
- 查看日志
因?yàn)槭莟omcat部署的后端服務(wù),所以要查看tomcat的catalina.out
日志文件,使用cat
命令
cat catalina.out.2024-03-26
- 篩選出具體的api接口
cat catalina.out.2024-03-26| grep "/api/get"
- 篩選請(qǐng)求json字符串對(duì)應(yīng)設(shè)備號(hào)的value值
首選,我們請(qǐng)求參數(shù)是一串json字符串,假如是這樣的:
{ "code", "0B403940FF289695FC093BF2556FFD75", "type":1}
所以需要獲取json對(duì)應(yīng)key,也就是我們的設(shè)備號(hào)code,對(duì)應(yīng)的值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對(duì)應(yīng)參數(shù)
- awk -F "[,:}]" :按照中括號(hào)中的內(nèi)容,}:依次分割字符串
- {for(i=1;i<=NF;i++){if($i~"code"){print $(i+1)} }}:遍歷篩選出來的數(shù)據(jù),匹配到code打印出對(duì)應(yīng)的value
通過上面的linux命令,打印出來的是
"0B403940FF289695FC093BF2556FFD75" "0B403940FF289695FC093BF2556FFD76" ....
如果覺得比較別扭,可以去掉"
字符,使用命令
tr -d '"'
打印:
0B403940FF289695FC093BF2556FFD75 0B403940FF289695FC093BF2556FFD76 ....
- 統(tǒng)計(jì)字符串出現(xiàn)的次數(shù)
統(tǒng)計(jì)字符串重復(fù)次數(shù),可以使用uniq -c
,然后為什么還要在前面加上sort
命令?因?yàn)?code>uniq這個(gè)命令只能統(tǒng)計(jì)連續(xù)的的重復(fù)行。所以需要結(jié)合sort命令使用,先sort排序,然后uniq統(tǒng)計(jì)重復(fù)的行
sort | uniq -c
打印,可以看出可以統(tǒng)計(jì)數(shù)量了,但是,沒排序
1000 0B403940FF289695FC093BF2556FFD75 1001 0B403940FF289695FC093BF2556FFD76 999 0B403940FF289695FC093BF2556FFD77 ....
- 按照調(diào)用次數(shù)進(jìn)行倒序
sort命令的-n
表示按照數(shù)值排序,-r
表示按照數(shù)值降序排序,所以需要加上排序命令
sort -nr
999 0B403940FF289695FC093BF2556FFD77 1000 0B403940FF289695FC093BF2556FFD75 1001 0B403940FF289695FC093BF2556FFD76 ....
總結(jié)歸納
如果遇到param=0b33131
等等這樣傳參的可以使用如下命令進(jìn)行篩選,意思是使用param=
作為分隔符
awk -F '(param=)' '{print $2}'
如果遇到和本文類似的場(chǎng)景,直接使用命令進(jìn)行統(tǒng)計(jì)即可:
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
到此這篇關(guān)于Linux統(tǒng)計(jì)某個(gè)字符串出現(xiàn)次數(shù)并排序的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Linux統(tǒng)計(jì)字符串出現(xiàn)次數(shù)并排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Apache、Nginx下Font Awesome在 Firefox 中不顯示問題解決方法
這篇文章主要介紹了Apache、Nginx下Font Awesome在 Firefox 中不顯示問題解決方法,在配置中增加一個(gè)響應(yīng)頭即可解決這個(gè)問題,需要的朋友可以參考下2014-07-07Polysh命令實(shí)現(xiàn)多日志查詢的方法示例
大家應(yīng)該都知道Polysh是一個(gè)交互式命令,可以在一臺(tái)服務(wù)器上批量的對(duì)一批服務(wù)器進(jìn)行處理,運(yùn)行交互式命令。下面這篇文章主要給大家介紹了關(guān)于利用Polysh命令實(shí)現(xiàn)多日志查詢的相關(guān)資料,需要的朋友可以參考,下面來一起看看吧。2017-12-12ubuntu系統(tǒng)中/etc/rc.local和/etc/init.d/rc.local的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于在ubuntu系統(tǒng)下/etc/rc.local和/etc/init.d/rc.local區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)需要的朋友們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-08-08Linux實(shí)現(xiàn)科學(xué)上網(wǎng)
本文給大家介紹的是Linux下使用plink ssh + privoxy 實(shí)現(xiàn)局域網(wǎng)共享代理,非常的全面細(xì)致,這里推薦給大家。2015-03-03