特定の期間内にログファイルをgrepする方法


22

ログファイルがあり、ログの各行には次のように日付が追加されます。

2012-03-06 11:34:48,657 blah blah blah...

grepこのファイルを取得して、午前8時から午後11時までの行のみを取得するにはどうすればよいですか?

私の意図は、午前8時から午後11時までに発生したエラーの数をカウントすることです。

回答:


24
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'

詳細な説明は、さまざまな正規表現(正規表現)チュートリアルにあります。egrep「POSIX拡張」構文(man 7 regex)を使用します。

  • 最初^は「行の始まり」を意味します。

  • [^ ]+ 実際の日付に関係なく、日付フィールドと一致します。

    • [...]は、「括弧内の任意の文字」を意味するため[89]8またはのいずれかに一致します9[0-9]任意の数であり、[^ ]何でもあり除き、(理由のスペース^内部ブラケット)。

    • +手段「一以上の前の」(例えば、a+一致するであろうaaaaaaaaaaaa)。

    • したがって^[^ ]+、行の先頭から開始し、スペース以外の文字をできるだけ多く一致させます。

  • (...|...|...)「与えられたパターンの(0[89]|1[0-9]|2[012])いずれ0[89]か」を意味するため、「どちらか1[0-9]または2[012]」を意味します。08〜22のすべての数字に一致します。


やや良いオプションは次のとおりです。

awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'

この-Fオプションは、すべての行を[: ]正規表現に従って(:またはスペースに一致する)別のフィールドに分割し、awkスクリプトは2番目の列(時間)をチェックします。


こんにちは、動作します..しかし、動作の仕組みについて少し説明を追加できますか?役に立たない^[^ ]+..
ロスディ

20

なぜ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


1
OPは、午前8時から午後11時までのすべてのログを望んでおり、ボットは特定の日のログのみを望んでいます。
デニス

1
彼もそれができます。例:sed -n '/ 2012-3-06 11:34:48 /、/ 2012-3-06 16:34:48 / p' logfile.name
Nima G

1
厄介なタイプミス。私が意味したのは、特定の日のものではありません
デニス

2
このアプローチの問題は、そのタイムスタンプを持つ行がログファイルにある必要があることです。上記の例では、タイムスタンプが2012-03-06 11:34:48の行がない場合、何も出力されません。上記のawkのアプローチはそのような場合に機能します(つまり、8〜11の時間のすべてのログが必要ですが、2012-03-06 08:00:00にログエントリがあるかどうかはわかりません)まったく時間)。
user650654 14年

0

実際には、これを行うためのはるかに簡単な方法があります。

ダウンロード/ドキュメント: 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」は、関心のあるログの行にある文字列の1つです。

  • 「a2ensite」は、「INFO」文字列が見つかると同じ行にある別の文字列です。これら2つの文字列(INFOおよびa2ensite)を指定すると、特に巨大なログファイルを処理する場合に、必要な行をより迅速に分離して処理できます。

  • 5は警告を指定します。5を指定すると、指定した検索文字列が少なくとも5回出現した場合に警告として警告するようにプログラムに指示します。

  • 10はクリティカルを指定します。10を指定すると、指定した検索文字列が少なくとも10回出現した場合にクリティカルとして警告するようにプログラムに指示します。

  • -showは、取得する応答のタイプを指定します。-shownを指定すると、指定されたパターンに一致するものが見つかった場合に、画面に出力します。

サンプル実行:

# ./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は、検索を要求した実際の日付範囲または時間枠がログに見つからなかったことを意味します。この場合、指定した時間に最も近い時間が検出され、代わりに使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.