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