2017-02-14 69 views
1

希望有人可以用bash linux腳本來幫助我從http日誌生成報告。使用awk從apache http日誌生成報告

日誌格式:

domain.com 101.100.144.34 - r.c.bob [14/Feb/2017:11:31:20 +1100] "POST /webmail/json HTTP/1.1" 200 1883 "https://example.domain.com/webmail/index-rui.jsp?v=1479958955287" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" 1588 2566 "110.100.34.39" 9FC1CC8A6735D43EF75892667C08F9CE 84670 - - - - 

輸出要求:

time in epoch,host,Resp Code,count 

1485129842,101.100.144.34,200,4000 
1485129842,101.101.144.34,404,1889 

我有這麼遠,但沒有接近我所試圖實現:

tail -100 httpd_access_*.log | awk '{print $5 " " $2 " " $10}' | sort | uniq 
+0

日誌內容是否持續增長?在這種情況下,您可能想要禁用緩衝。 – Inian

回答

0
awk 'BEGIN{ 
    # print header 
    print "time in epoch,host,Resp Code,count" 
    # prepare month conversion array 
    split("Jan Feb Mar Apr May Jun Jui Aug Sep Oct Nov Dec", tmp) 
    for (i in tmp) M[tmp[i]]=i 
    } 

    { 
    #prepare time conversion for mktime() using array and substitution 
    # from 14/Feb/2017:11:31:20 +1100 
    # to YYYY MM DD HH MM SS [DST] 
    split($5, aT, /[:/[:blank:]]/) 
    t = $5; sub(/^.*:|:/, " ", t) 
    t = aT[3] " " M[aT[2]] " " aT[1] t 

    # count (not clear if it s this to count due to time changing 
    Count[ sprintf("%s, %s, %s", mktime(t), $2, $10)]++ 
    } 

    END{ 
     # disply the result counted 
     for(e in Count) printf("%s, %d\n", e, Count[e]) 
     } 
    ' httpd_access_*.log 
  • 計數要更specificaly描述,以確保有關的標準來算
  • 需要GNU AWK的mktime()函數
  • 假設時間總是以這種格式
  • 這種沒有安全也沒有過濾器(不是目的)
0

當然,上面的基於純AWK的解決方案會更快,更完整。 但也可以在更小的步驟來完成:

首先獲取日期並將其轉換爲EPOCH:

$ dt=$(awk '{print $5,$6}' file.log) 
$ ep=$(date -d "$(sed -e 's,/,-,g' -e 's,:, ,' <<<"${dt:1:-1}")" +"%s") 
$ echo "$ep" 
1487032280 

既然現在你已經在bash的變量$ EP時代的日期,你可以繼續你initiall AWK是這樣的:

$ awk -v edt=$ep '{print edt","$2","$10}' file.log 
1487032280,101.100.144.34,200 

如果你想有一個頭,你可以用一個簡單的回聲最後的awk之前打印一個。