用 awk 來處理 apache日誌
awk 簡介:
awk於1970年誕生于貝爾實驗室,是一門用於處理文本資料的程式語言,名稱來自於3位作者名字的首字母(Alfred Aho, Peter Weinberger, and Brian Kernighan),gawk為GNU awk。
常量符:
ARGC 命令列變元個數
ARGV 命令列變元數組
FILENAME 當前輸入檔案名稱
FNR 當前檔案中的記錄號
FS 輸入欄位分隔字元,預設為一個空格
RS 輸入記錄分隔字元
NF 目前記錄裡域個數
NR 到目前為止記錄數
OFS 輸出域分隔字元
ORS 輸出記錄分隔字元
通常 Apache 日誌格式如下所示:
`127.0.0.1 - - [02/Sep/2009:17:12:03 +0800] "GET /index.php?a1=100&a2=good HTTP/1.1" 200`
假設檔案 my-access_log 裡面存在上面這條日誌,我們使用如下的命令來分析這條日誌:
#awk '{printf "%s/n%s/n%s/n%s/n%s/n%s/n%s/n%s/n%s/n",$1,$2,$3,$4,$5,$6,$7,$8,$9}' my-access_log
127.0.0.1
-
-
[02/Sep/2009:17:12:03
+0800]
"GET
/index.php?a1=100&a2=good
HTTP/1.1"
200
從結果中可以看到 awk 是用空白字元將一行文本分隔成若干個欄位,127.0.0.1 即為第一個欄位,狀態代碼200為最後一個
樣本:
1,計算a2=good的日誌的條數
#awk '{$7 ~ /a2=good/}' my-access_log | wc -l
2,與運算,a2等good && 請求時間大於17:00:00
#awk '{if( ($7 ~/a2=good/) && $4>"[02/Sep/2009:17:00:00") print $1}' | wc -l
3,調用awk命令檔案
#awk -f commond.awk
條件運算子和關係運算子跟C語言類似
與或非(&&,||,!)
大於,小於,等於,不等於(>,<,==,!=)
正則匹配符
匹配(~)
不匹配(!~)
未完待續,初級研究,僅供參考。