로그 형식은 다음과 같습니다.
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