GNU/Linux >> Linux の 問題 >  >> Linux

2つのタイムスタンプ間のログを抽出する方法は?

2つのタイムスタンプの間のすべてのログを抽出したい。一部の行にはタイムスタンプがない場合がありますが、それらの行も必要です。つまり、2つのタイムスタンプに該当するすべての行が必要です。私のログ構造は次のようになります:

[2014-04-07 23:59:58] CheckForCallAction [ERROR] Exception caught in +CheckForCallAction :: null
--Checking user--
Post
[2014-04-08 00:00:03] MobileAppRequestFilter [DEBUG] Action requested checkforcall

2014-04-07 23:00の間のすべてを抽出したいとします。 および2014-04-08 02:00

開始タイムスタンプまたは終了タイムスタンプがログにない場合があることに注意してください。ただし、これら2つのタイムスタンプの間のすべての行が必要です。

承認された回答:

awkを使用できます このために:

$ awk -F'[]]|[[]' 
  '$0 ~ /^[/ && $2 >= "2014-04-07 23:00" { p=1 }
   $0 ~ /^[/ && $2 >= "2014-04-08 02:00" { p=0 }
                                        p { print $0 }' log

場所:

  • -F [の文字を指定します および] 正規表現を使用したフィールドセパレータとして
  • $0 完全な行を参照します
  • $2 日付フィールドを参照します
  • p 実際の印刷を保護するブール変数として使用されます
  • $0 ~ /regex/ 正規表現が$0と一致する場合はtrue
  • >= 文字列を辞書式に比較するために使用されます(例:strcmp()

バリエーション

上記のコマンドラインは、右オープン時間間隔マッチングを実装しています。閉じた間隔のセマンティクスを取得するには、適切な日付をインクリメントするだけです。例:

$ awk -F'[]]|[[]' 
  '$0 ~ /^[/ && $2 >= "2014-04-07 23:00"    { p=1 }
   $0 ~ /^[/ && $2 >= "2014-04-08 02:00:01" { p=0 }
                                           p { print $0 }' log

別の形式のタイムスタンプを照合する場合は、$0 ~ /^[/を変更する必要があります サブ式。印刷のオン/オフロジックからのタイムスタンプのない行を無視していたことに注意してください。

たとえば、YYYY-MM-DD HH24:MI:SSのようなタイムスタンプ形式の場合 ([]なし 中かっこ)次のようにコマンドを変更できます:

$ awk 
  '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]/
      {
        if ($1" "$2 >= "2014-04-07 23:00")     p=1;
        if ($1" "$2 >= "2014-04-08 02:00:01")  p=0;
      }
    p { print $0 }' log

(フィールドセパレータも変更されていることに注意してください–デフォルトの空白/非空白遷移に)


Linux
  1. tailコマンドを使用してログをリアルタイムで表示する方法

  2. それらを含む2つのパターン間の最初の発生を選択する方法は?

  3. 2つのタイムスタンプ間のログを抽出する方法は?

  1. 2つのリモート間でファイルをRsyncする方法は?

  2. Journalctlをクリアする方法は?

  3. ffmpeg出力から継続時間を抽出するには?

  1. ncおよびpvコマンドを使用して2台のコンピューター間でファイルを転送する方法

  2. Bash:2 つのタイムスタンプ間の経過時間を計算する

  3. 2 回の間に作成されたファイルを削除するには?