特定の期間内にログファイルをgrepする方法
私はログファイルを持っていますが、ログの各行は以下のように日付が付加されています。
2012-03-06 11:34:48,657 blah blah blah...
このファイルをgrep
して、午前8時から午後11時までの行だけを取得するには?
私はログファイルを持っていますが、ログの各行は以下のように日付が付加されています。
2012-03-06 11:34:48,657 blah blah blah...
このファイルをgrep
して、午前8時から午後11時までの行だけを取得するには?
egrep '^[^]+ (0[89]|1[0-9]|2[012]):'
詳しい説明は、様々な regex (正規表現) チュートリアルにあります; egrep
は「POSIX拡張」構文(man 7 regex
)を使用しています。
最初の^
は「行の開始」を意味します。
[^]+
は実際の日付に関係なく、単に日付フィールドにマッチします。
(...|...|...)
は「与えられたパターンのいずれか」を意味するので、(0[89]|1[0-9]|2[012])
は「0[89]
または 1[0-9]
または 2[012]
のいずれか」を意味します。
もう少し良いオプションは次の通りです:
awk -F'[:]' '$2 >= 8 && $2 <= 22 { print }'
-F
オプションは、[:]
正規表現に従って各行を別々のフィールドに分割し(:
またはスペースのどちらかにマッチ)、awkスクリプトは2列目(時間)をチェックします。
実際にはもっと簡単な方法があります。
ダウンロード/ドキュメント。autodrgrep.kl.sh ](http://www.kinglazy.com/grep-date-range-in-log-files-awk-sed-linux-unix.htm)
コマンド:
./autodrgrep.kl.sh notchef /tmp/client.log '2016-05-08_08:00:00,2016-05-08_23:00:00' 'INFO' 'a2ensite' 5 10 -show
説明:
autodrgrep.kl.sh はツール名です。
notchefは、ツールに何をすべきかを伝えるために渡されるオプションです。この特定のケースでは、/tmp/client.logがどのタイプのログファイルであるかをツールに伝えています。
/tmp/client.logはもちろんログファイルです。
2016-05-08_19:12:00,2016-05-08_21:13:00はスキャンしたいログの中から日付の範囲
“INFO "は気になるログの行にある文字列の一つです。
"a2ensite "は、"info "の文字列が見つかると期待する同じ行にある別の文字列です。この2つの文字列(INFOとa2ensite)を指定することで、特に巨大なログファイルを扱う場合には、必要な行をより速く分離して処理することができます。
5はWarningを指定します。5を指定すると、指定した検索文字列が5回以上出現した場合にWARNINGとして警告するようにプログラムに指示します
10はCriticalを指定します。10を指定することで、指定した検索文字列が10件以上出現した場合、CRITICALとして警告するようにプログラムに指示していることになります。
-show は、取得するレスポンスのタイプを指定します。showを指定することで、指定したパターンに一致するものが見つかった場合、画面に出力するということです。
実行例:
# ./autodrgrep.kl.sh notchef /tmp/client.log '2016-05-08_19:12:00,2016-05-08_21:13:00' 'INFO' 'a2ensite' 5 10 -show
[2016-05-08 19:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:13:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 19:42:57-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:42:57-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:42:57-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:43:08-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:43:11-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:13:10-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:42:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:42:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:42:59-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:43:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:43:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 21:12:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 21:12:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 21:12:59-07:00] INFO: execute[a2ensite default] ran successfully
23
2---78720---23---ATWFILF---(2016-05-08)-(19:12)---(2016-05-08)-(21:13) SEAGM
**ユーザが指定した日付範囲や時間枠がログにない場合はどうなりますか?
ATWFILFは、検索を要求した実際の日付範囲または時間枠がログに見つかったことを意味します。なので、これは非常に良いことです。
ETWNFILFは、検索を要求した実際の日付範囲または時間枠がログに見つからなかったことを意味します。この場合、指定した時刻に最も近い時刻が検出され、代わりに使用されます。