標籤:
前面我發布過"Hadoop兮,殺雞別用牛刀,python+shell實現一般記錄檔的查詢、統計", 需要結合python, 可能還是有一定的門檻, 現將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)Regex匹配統計
cat *.log | grep ".*Append \(http:\/\/.*\?\) to .*"
查看*.log中匹配Regex .*Append (http:\/\/.*\?) to .* 的行, 為什麼括弧前要加斜杠呢? 這是shell中Regex比較特殊的地方, 括弧還有其他個別符號前需要加斜杠.
(4)將匹配Regex的內容抽取出來, 排重, 再統計.
比如說一個爬蟲記錄檔中, 我要統計被抓取網址的數量, 統計的網址不能重複. 已知日誌的格式為" Append http://網址 ......." , 同一個網址可能出現多次, 運用上一個統計方法統計出來的是網址出現的總數量, 沒有將網址排重, 於是:
cat * |grep "Append" |sed ‘s/.*Append \(http:\/\/.*\?\) to .*/\1/g‘|uniq|wc -l
注意第一個管道grep將符合規則(含有"Append")的行抽出來, 第二個管道sed是shell中家喻戶曉的替換命令, 使用方式為 sed ‘s/Regex/替換的內容/g‘, 我們在Regex裡使用了分組(就是那個括弧), 替換內容裡用到了\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的寫法基本是固定的, 需要改動的只是Regex的部分.
Shell 中常見的日誌統計方法