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つのタイムスタンプ間のすべての行が必要です。
ベストアンサー1
次の目的で使用できます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/
正規表現が一致した場合はtrue$0
>=
文字列をアルファベット順に比較するために使用されます(例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
(フィールド区切り文字も変更されました。空白/非空白に切り替え、デフォルト)