Shell 中常見的日誌統計方法

前面我發佈過"Hadoop兮,殺雞別用牛刀,python+shell實現通常日誌文件的查詢、統計", 須要結合python, 可能仍是有必定的門檻, 現將shell部分剝離出來. 舉例一些最基本的日誌統計方法.python

(1)查看文件mysql


more crawler.log

查看crawler.log日誌正則表達式


tail -n 100 crawler.log

查看crawler.log的最後100行sql


(2)匹配統計shell


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

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


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


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

查看*.log中匹配正則表達式 .*Append (http:\/\/.*\?) to .*  的行, 爲何括號前要加斜槓呢? 這是shell中正則表達式比較特殊的地方, 括號還有其餘個別符號前須要加斜槓..net


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

好比說一個爬蟲日誌文件中, 我要統計被抓取網址的數量, 統計的網址不能重複. 已知日誌的格式爲" Append http://網址 ......." , 同一個網址可能出現屢次, 運用上一個統計方法統計出來的是網址出現的總數量, 沒有將網址排重, 因而:code


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]}'

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


(7)分組統計排序

上一個例子輸出的格式是: 分組,出現的次數. 若是須要在輸出的時候按照出現的次數排序, 那麼須要在後面加一個管道sort

|sort -t ',' -k 2 -n

其中的參數-t ','表示用逗號分割數據, 結合上面的案例, 將會分紅兩列, 第一列是網址, 第二列是出現的次數, -k 2 表示第二列參與排序, -n表示把它當成數字來排序, 不加這個參數會出現'10'比'2'小的狀況. 若是你要將倒敘拍列輸出結果, 能夠加參數-r  


只要掌握以上的基本用法, 能夠知足大部分的平常統計需求了, 其中awk的寫法基本是固定的, 須要改動的只是正則表達式的部分. 裏面的每一個命令更詳細的用法請查閱資料.

相關文章
相關標籤/搜索