GREPはキーワード、日付、タイムスタンプに基づいてログファイルをフィルタリングできますか?それとも、より良いオプションがありますか?

GREPはキーワード、日付、タイムスタンプに基づいてログファイルをフィルタリングできますか?それとも、より良いオプションがありますか?

以下に基づいてログファイルをフィルタリングしようとしています。

無効な日付範囲(yyyy-mm-dd)

無効なタイムスタンプ範囲(01:00:00 - 00:00:00)

キーワード(previousFireTime、nextFireTime)

ログファイルを試してみgrepましたが正しく機能しません。必要な情報を取得するには、またはを組み合わせてgrep使用​​する必要がありますか?それとも、ログファイルをフィルタリングするより良い、効率的な方法はありますか?awkgrepawksed

編集:サンプルログ出力

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/'

おすすめ記事