以下に基づいてログファイルをフィルタリングしようとしています。
無効な日付範囲(yyyy-mm-dd)
無効なタイムスタンプ範囲(01:00:00 - 00:00:00)
キーワード(previousFireTime、nextFireTime)
ログファイルを試してみgrep
ましたが正しく機能しません。必要な情報を取得するには、またはを組み合わせてgrep
使用する必要がありますか?それとも、ログファイルをフィルタリングするより良い、効率的な方法はありますか?awk
grep
awk
sed
編集:サンプルログ出力
2018-06-06 10:46:43,708 INFO [stdout] (AsyncAppender-Worker-STDOUT) INFO
[erFactoryBean_Worker-9] [c.c.c.s.i.d.ResendJob] Executing Quartz scheduled
job: JobExecutionContext: trigger: 'ResendJob.trigger_ResendJob job:
DEFAULT.ResendJob fireTime: 'Wed Jun 06 10:46:43 UTC 2018 scheduledFireTime:
Wed Jun 06 10:46:43 UTC 2018 previousFireTime: 'Wed Jun 06 10:45:43 UTC 2018
nextFireTime: Wed Jun 06 10:47:43 UTC 2018 isRecovering: false refireCount: 0
ベストアンサー1
awk
正規表現のマッチング、行をフィールドに分割し、文字列比較を実行できるため、必要になる場合があります(YYYY-MM-DD HH:MM:SSタイムスタンプを使用し、DST変更がない限り日付比較に適しています) 。 。
日付が最初のフィールドにあり、時間が2番目のフィールドにある場合:
awk -v date=1 -v time=2 '
$date > "2018-05-24" && $time < "12:00:00" && /some text/'
GNU awkの実装には、awk
次の高度なタスクを実行できる日付の解析と書式設定拡張機能があります。
gawk -v date=1 -v time=2 '
function parse_time(t) {
gsub(/[:-]/, " ", t)
return mktime(t)
}
BEGIN {
start = parse_time("2018-01-01 08:00")
end = systime() - 86400 # yesterday, same time
}
{t = parse_time($date" "$time)}
t >= start && t <= end && /some test/'