2つの日付の間に「ERROR」という単語を含むログを読む

2つの日付の間に「ERROR」という単語を含むログを読む

ログ形式は次のとおりです。

2018-06-25 00:00:20,073 DEBUG SAMPLE TEXT CONTENT
2018-06-26 00:00:20,073 ERROR SAMPLE TEXT CONTENT
2018-06-26 17:37:20,073 ERROR SAMPLE TEXT CONTENT
2018-06-26 19:00:20,073 DEBUG SAMPLE TEXT CONTENT
2018-06-27 00:00:20,073 DEBUG SAMPLE TEXT CONTENT
2018-06-28 00:00:20,073 ERROR SAMPLE TEXT CONTENT
2018-06-29 00:00:20,073 ERROR SAMPLE TEXT CONTENT
2018-06-30 00:00:20,073 DEBUG SAMPLE TEXT CONTENT
2018-07-01 11:00:20,073 ERROR SAMPLE TEXT CONTENT
2018-07-02 02:00:20,073 DEBUG SAMPLE TEXT CONTENT
2018-07-02 00:00:20,073 ERROR SAMPLE TEXT CONTENT
2018-07-03 20:00:20,073 ERROR SAMPLE TEXT CONTENT

2つの日付(2018-06-26から2018-07-02と仮定)の間に「ERROR」という単語を含むすべてのログを見つけて表示したいです。日付は動的に取得されるため、$ FROMおよび$ TO変数になります。

すべてgrepまたは実装が実行されますawksed

編集:$ TOと$ FROMの日付の両方を含める必要があり、複数のログファイルにアクセスする必要があるため、ログがソートされない可能性があります。

答え1

awk,-vオプションを使用してシェル変数を awk 変数に渡します。

$ awk -v from="$FROM" -v to="$TO" 'from <= $1 && $1 <= to && /ERROR/' log.txt
2018-06-26 00:00:20,073 ERROR SAMPLE TEXT CONTENT
2018-06-26 17:37:20,073 ERROR SAMPLE TEXT CONTENT
2018-06-28 00:00:20,073 ERROR SAMPLE TEXT CONTENT
2018-06-29 00:00:20,073 ERROR SAMPLE TEXT CONTENT
2018-07-01 11:00:20,073 ERROR SAMPLE TEXT CONTENT
2018-07-02 00:00:20,073 ERROR SAMPLE TEXT CONTENT

答え2

AWKを使用:

awk '/'$FROM'/,/'$TO'/ {print $0}' log.txt | grep ERROR

sedを使用してください:

sed -n '/'$FROM'/,/'$TO'/p' log.txt | grep ERROR

答え3

シンプルながら効果的です。

egrep '2018-06-26|2018-07-02' log file | grep "ERROR"

答え4

周期日(渡す):

FROM=2018-06-26
TO=2018-07-02
d=$FROM
while [ $d != $TO ]; do 
  grep "^${d}.*ERROR" logfile
  d=$(date -I -d "$d + 1 day")
done

関連情報