Shell 中常見的日志統計方法

ne3g 9年前發布 | 36K 次閱讀 Linux Shell

實例說明shell 中一些常見的日志統計方法: 查找, 抽取, 統計, 排重統計, 最大值/最小值/平均值統計, 分組統計. 舉例一些最基本的日志統計方法.

(1)查看文件


more crawler.log

查看crawler.log日志


tail -n 100 crawler.log

查看crawler.log的最后100行


(2)匹配統計


cat *.log | grep "ERROR" |wc -l

統計在*.log中出現ERROR的行數, 去掉最后一個管道(即: cat *.log | grep "ERROR" )可以查看具體匹配的是哪些行, 大文件不建議這樣做.


(3)正則表達式匹配統計


cat *.log | grep ".*Append \(http:\/\/.*\?\) to .*"

查看*.log中匹配正則表達式 .*Append (http:\/\/.*\?) to .*  的行, 為什么括號前要加斜杠呢? 這是shell中正則表達式比較特殊的地方, 括號還有其他個別符號前需要加斜杠.


(4)將匹配正則表達式的內容抽取出來, 排重, 再統計.

比如說一個爬蟲日志文件中, 我要統計被抓取網址的數量, 統計的網址不能重復. 已知日志的格式為" Append http://網址 ......." , 同一個網址可能出現多次, 運用上一個統計方法統計出來的是網址出現的總數量, 沒有將網址排重, 于是:


cat * |grep "Append" |sed 's/.*Append \(http:\/\/.*\?\) to .*/\1/g'|uniq|wc -l

注意第一個管道grep將符合規則(含有"Append")的行抽出來, 第二個管道sed是shell中家喻戶曉的替換命令, 使用方式為 sed 's/正則表達式/替換的內容/g', 我們在正則表達式里使用了分組(就是那個括號), 替換內容里用到了\1代表第一個分組, 如果是第二個則\2,以此類推. 我們先是找到匹配的行,用匹配的第一個分組替換了整行, 這個分組正是我們需要的網址, 因此達到了提取網址的作用. 下一個管道unique是將重復的網址排除, 最后一個管道wc -l是數量統計.



(5)最大數/最小數/平均數統計

基于上一個例子, 如果我們提取的是一個數字, 要進行最大數/最小數/平均數的統計, 需要用到awk管道了, 將wc -l 換成:


awk '{if(min==""){min=max=$1}; if($1>max) {max=$1}; if($1< min) {min=$1}; total+=$1; count+=1} END {print total/count, min, max}'


(6)分組統計

基于第(4)個例子, 如果要統計每個網址出現的次數, 實現類似于mysql group by的效果. 將wc -l 換成:


awk  '{a[$1]++}END{for (j in a) print j","a[j]}'

輸出格式: 分組,出現的次數



只要掌握以上的基本用法, 可以滿足大部分的日常統計需求了, 其中awk的寫法基本是固定的, 需要改動的只是正則表達式的部分.


 本文由用戶 ne3g 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!