web-dev-qa-db-ja.com

時間範囲内でhttpd error_logをgrepする方法?

時間範囲に基づいて、巨大な(120GB)httpd error_logからの行のみをgrepするにはどうすればよいですか。

from 2011-11-15 11:30 pm
to   2011-11-16 01:30 am

ありがとう!

3
ohho

おそらく、ドリルダウンを行う必要があります。まず、日付範囲を取得します。

grep -e "2011\-11\-[15-16] " error_log > filtered
grep -v -e "2011\-11\-15 [0-10]:" | grep -v -e "2011\-11\-15 11:[0-29]" > filtered
grep -v -e "2011\-11\-16 [2-23]:" | grep -v -e "2011\-11\-16 01:[31-59]" > filtered

cat filtered

私が考えることができるがまだ行っていない最も効率的な方法は、日付範囲の開始バイトと終了バイトを見つけてそれを取得することです。 (これはgrepで明らかに可能です)しかし、ファイルからバイトの範囲を取得する方法がわかりません-おそらくいくつかのawkスキルが必要です

編集:これは興味深い質問だったので-私はもう少し掘り下げました:

次の手順を実行すると、最初のバイトオフセットを取得できます。

 # Get first byte offset, leftmost number is the offset...
grep -m 1 -b "2011-11-15 11:3" error_log
 # Get last byte offset
grep -m 1 -b "2011-11-16 01:3" error_log

 #(Subtract first number from last number to get byte length) Then do:

dd if=error_log of=filtered bs=c skip=<first number> count=<last_byte#-first_byte#>
3
thinice

awk '$ 3> "11:30:00" && $ 3 <"13:30:00"' log_file |もっと少なく

$ 3はタイムスタンプであるログファイルの3番目の列です。ログファイルごとに任意の数値を使用できます。

1
Irfan Mansoori