私はログファイルを持っています、ログの各行はそのように日付で始まります:
2012-03-06 11:34:48,657 blah blah blah...
このファイルをgrep
して、午前8時から午後11時までの行だけを取得するにはどうすればよいですか?
私の意図は、午前8時から午後11時までに発生したエラーの数を数えたいということです。
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'
詳細な説明はさまざまな 正規表現 (正規表現)のチュートリアルにあります。 egrep
は「POSIX拡張」構文(man 7 regex
)を使用します。
最初の^
は「行の先頭」を意味します。
実際の日付に関係なく、[^ ]+
は単に日付フィールドと一致します。
[...]
は「括弧内の任意の文字」を意味するため、[89]
は8
または9
のいずれかと一致します。 [0-9]
は任意の数字、[^ ]
は任意のを除いたスペースを含みます(括弧内の^
のため)。
+
は、「前のものの1以上」を意味します(たとえば、a+
はa
、aaa
、およびaaaaaaaa
に一致します)。
そのため^[^ ]+
は行頭から始まり、できるだけ多くの非スペース文字にマッチします。
(...|...|...)
は「与えられたパターンのいずれか」を意味するので、(0[89]|1[0-9]|2[012])
は「0[89]
または1[0-9]
または2[012]
」を意味します。それは08から22までのすべての数と一致します。
やや良い選択肢は:
awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'
-F
オプションは、([: ]
またはスペースのいずれかと一致する):
regexに従ってすべての行を別々のフィールドに分割し、awkスクリプトは2列目(時)をチェックします。
なぜgrepを使わないのですか?あなたは単にsedを使うことができます。
例:
sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log
これはJune 17 13:39:54
とJune 18 10:50:28
の間のすべてのログを印刷します。
これを行うには、実際にははるかに簡単な方法があります。
ダウンロード/ドキュメント: autodrgrep.kl.sh
コマンド:
./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は警告を指定します。 5を指定すると、指定した検索文字列が少なくとも5回出現すると、警告として警告するようにプログラムに指示します。
10はCriticalを指定します。 10を指定すると、指定した検索文字列が少なくとも10回出現すると、プログラムはCRITICALとして警告するように指示されます。
-showはどのような種類の応答が得られるかを指定します。 -shownを指定することで、指定されたパターンに一致するものが見つかった場合、screenに出力します。
サンプル実行:
# ./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"のいずれかを示す行(出力の最後の行)が必ず表示されます。
ATWFILFは、検索を要求した実際の日付範囲または時間枠がログで見つかったことを意味します。だからこれはとても良いです。
ETWNFILFは、検索を要求した実際の日付範囲または時間枠がログに見つからなかったことを意味します。この場合、指定した時間に最も近い時間が検出され、代わりに使用されます。