2017-02-14 8 views
1

誰かがhttpログからレポートを生成するためのbash linuxスクリプトを手伝ってくれることを願っています。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
  • は、mktime関数用GNU AWKを必要とカウントする基準について確認するために記述されます)
0

確かに、上記の純粋なAWKベースのソリューションははるかに速く、より完全です。 しかし、また、小さなステップで行うことができます

まずGET日付とEPOCHに変換します。今、あなたは、bashの変数$ EPにおけるエポックの日付を持っているので

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

、あなたはあなたのinitiallを続行することができますこのようなawk:

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

ヘッダーが必要な場合は、単純なエコーで最後のawkの前に印刷することができます。

関連する問題