두 날짜 사이에 'ERROR'라는 단어가 포함된 로그 읽기

두 날짜 사이에 '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

두 날짜(2018-06-26부터 2018-07-02라고 가정) 사이에 "ERROR"라는 단어가 포함된 모든 로그를 찾아 표시하고 싶습니다. 날짜를 동적으로 가져오므로 $FROM 및 $TO 변수가 됩니다.

모든 grep또는 구현이 수행됩니다 awk.sed

편집: $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

관련 정보