linux下使用awk,wc,sort,uniq,grep對nginx日誌進行分析和統計
通過對awk, wc, uniq, grep, sort等命令的組合,分析nginx的access和error日誌。
統計各種總量、單位時間量。
access.log日誌格式(見下圖)
說明:
a). 按照Tab鍵拆分每項資料
b). 欄位含義(如下說明)
column1:ip_address
column2:log_time
column3:request
column4:status_code
column5:send_bytes
column6:referer
需求一:統計總記錄數,總成功數,各種失敗數:404,403,500
1. 提取總數
思路:拆分原始檔案,找到狀態列,按照不同條件值,分別獲取總數。
a). 使用awk拆分並提取狀態碼列,並保證該列值大於0,並使用wc命令計算總行
wc -l 對結果進行彙總
awk使用-F來指定資料項分隔符。一個字元可是直接使用,比如-F:(英文逗號分隔),否則應該使用英文‘’將分隔符括起來,比如
-F'\t'。
b). 新增說明資訊
wc -l 的結果作為awk的第一列,所以取$1
2. 提取成功、各種失敗總數
a). 200成功總數
在使用awk時,針對變數使用條件執行過濾
b). 404失敗總數
c). 403失敗總數
d).500失敗總數
需求二:各種錯誤中,哪類URL出現的次數最多,要求剔除重複項,並倒敘給出結果
思路:
1). 拆分獲取request和StatusCode
2). 對request再拆分獲取真實URL
3). 對URL排序,排重,再計算總數,最後再倒敘給出結果
a). 使用awk得到某類錯誤(status=500)包含request的中間結果。注意request和status之間使用空格連線
b). 針對中間結果再次使用空格進行拆分,獲取request中的URL
當內容預設使用空格或tab來分隔資料項時,使用awk拆分時,不需要使用-F來執行分隔符。
如下面命令中的 awk '{print $2}' 沒有使用-F指定分隔符。
c). 排序、去除重複項
使用sort對結果進行預設排序
使用uniq -c去除重複項並給出計數結果
d). 根據圖上結果,發現重複的URL會被自動計數,但是計數的結果順序是隨機的。我們需要再次針對結果進行排序,使用sort 中的 -k指定列,並指明要求是按照數字的倒敘
去除重複項後,希望對結果進行倒敘
-k指明使用哪一列進行排序,-k1:表示使用第一列進行排序
n指明排序列為數字
r代表使用倒敘
所以-k1nr 代表:要進行排序的第一列請作為數字看待,並且結果要進行倒敘
注意:在去重前,最好先使用sort對結果進行排序,然後才能順利合併。
需求三:要統計URL中檔名出現的次數,結果中要包含Code 和 Referer。但是 URL和 Referer中都包含 / 字元,對於過濾有干擾,嘗試去解決。
思路:
1). 先拆分獲取必要資料
2). 想辦法將URL中檔名之前的部分去除
3). 然後再排序等
a). 檢視原始檔案內容
使用cat命令檢視原始檔案內容。
b). 獲取必要資訊
由於是\t分隔各個資料項,所以符合預設拆分,不需要-F指明分隔符
c).將URL中檔名之前的部分剔除,但保留referer中的"/"。
這部分重點:使用了sed命令對URL進行過濾,只保留URL中的檔名部分,其餘部分不再要。
本sed命令只對第一列資料進行應用過濾操作。
#.*/\(.* \)#\1#解釋:
整個內容被#分成兩部分
第一部分(兩個#號中間的內容).*/\(.* \),用來匹配URL中的兩部分內容
比如URL為:/koubei/2012/11/19/60/abc.jpg (注意最後有一個空格)
.*/用來匹配:"/koubei/2012/11/19/60/"
\(.* \)用來匹配:"abc.jpg "
第二部分
\1,用來匹配第一部分中()中的內容,即 "檔名.副檔名 "
整個命令的含義是:
將URL替換成檔名
即將 "/koubei/2012/11/19/60/abc.jpg "替換成"abc.jpg "d). 執行排序
注意這裡要對第一列先進行排序,否則會影響去重。
e).去重
f).倒敘出結果