awkを使用して頻繁に発生するすべての時間間隔間のデータを読み取る方法

awkを使用して頻繁に発生するすべての時間間隔間のデータを読み取る方法

次の形式のログファイルがあります。

[30/Jan/2015:10:10:30 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 425
[30/Jan/2015:10:11:00 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 261
[30/Jan/2015:10:11:29 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 232
[30/Jan/2015:10:12:00 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 315
[30/Jan/2015:10:12:29 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 221
[30/Jan/2015:10:12:57 +0000] 12.30.30.182 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 218

このログファイルの各行には、最後のフィールドに応答時間があり、最初のフィールドにタイムスタンプがあります。awkすべての特定の時間間隔の平均応答時間を読み取る方法はありますか?たとえば、平均応答時間は5分ごとに計算されます。

私は静的な方法で、時間間隔の平均のみを提供する次の方法を試しました。

$ grep "30/Jan/2015:10:1[0-4]" mylog.log | awk '{resp+=$NF;cnt++;}END{print "Avg:"int(resp/cnt)}'

ただし、ファイル全体に対して5分をすべて実行する必要があります。コマンドを繰り返してもコマンドに日付を動的に渡すにはどうすればよいですか?ログファイルとその中の日付は毎回異なるためです。

それともこれに最良の選択肢がありますかawk?提案してください。

答え1

最初の終了時に、次のような状況が発生する可能性があります。

awk -F"[][ ]*" -v it=300 '{
    sub(":"," ",$2)
    gsub("/"," ",$2)
    "date +%s -d \""$2"\""|getline d
    if (d-f>it) {
        f=d
        if (NR!=1)
            print s/n 
        s=n=""
        }
    n++
    s+=$NF
    }' log.file
  • -F"[][ ]*"次のように使用F生産するS区切り文字は角かっこをさらに削除します。
  • -v it=300変数設定(秒単位間隔)
  • sub,gsubdateコマンド形式を準備するには、フィールドから記号を削除します。
  • dateフィールドを秒に変換(EPOCHから)
  • |getline d上記の内容をd変数に入れてください

関連情報