次の形式のログファイルがあります。
[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,gsub
date
コマンド形式を準備するには、フィールドから記号を削除します。date
フィールドを秒に変換(EPOCHから)|getline d
上記の内容をd
変数に入れてください