로그 파일에서 일부 예외를 추출하고 일부 처리를 수행하는 쉘 스크립트를 작성 중입니다. 현재 스크립트에서 다음 명령을 사용하여 예외가 발생한 로그 파일의 줄 번호를 캡처하고 있습니다. 예외 줄에는 ERROR
날짜 및 타임스탬프 뒤에 키워드가 포함됩니다.
lineNos=($(grep -n ERROR $file | grep Exception | cut -d':' -f1 | tail -3))
현재 스크립트를 테스트하는 동안 일부 로그 항목에 같은 줄에 오류와 예외가 포함되어 있음을 발견했지만 이는 실제로 내가 찾고 있는 오류 유형(예제 5줄)이 아니므로 내 스크립트를 다음과 같이 수정하고 싶습니다. 아래 예제 로그의 3행만 반환됩니다.
2016-10-21 15:25:37,231 INFO Processinng current row
2016-10-21 15:25:37,231 INFO com.test.main com.test.controller.CrashException:
2016-10-21 15:25:37,231 ERROR com.test.main com.test.controller.CrashException:
2016-10-21 15:25:37,231 DEBUG com.test.main com.test.controller.CrashException:
2016-10-21 15:25:37,231 DEBUG Processing row with ERROR and Exception
2016-10-21 15:25:37,231 DEBUG processed row 1:
답변1
ERROR
sum이라는 단어가 포함된 행을 얻으려면 Exception
다음을 시도하십시오.
grep -E "ERROR.*Exception" $file
답변2
awk
대신 을 사용하면 grep
줄 번호뿐만 아니라(더 정확하게는기록적인 숫자) 직접 테스트할 뿐만 아니라 공백으로 구분된 특정 필드를 개별적으로 테스트하기도 합니다.
awk '$3 == "ERROR" && /Exception/ {print NR}' logfile
또는 (더 구체적으로 - Exception
마지막 일치 항목으로 제한)
awk '$3 == "ERROR" && $NF ~ /Exception/ {print NR}' logfile
답변3
cat thelogfile.log | nl -ba | grep "ERROR"
이것은 파일을 nl로 번호가 매겨진 줄로 파이프한 다음 grep을 사용하여 오류 줄을 필터링합니다. 오류 줄 번호만 원하면 awk '{print $1}'를 추가하세요. cat은 행 번호에 -n 플래그를 사용할 수도 있지만 저는 nl을 선호합니다.
잘못된 행 번호 배열 변수의 예;
linenos=($(cat -n thelogfile.log | grep "ERROR" | awk '{print $1}' | tr "\n" " " | sed 's/$/\n/'))
편집하다:
그냥 ps grep;
grep ",[0-9]* ERROR"
답변4
보다 구체적인 정규식을 사용하십시오.
grep '^[0-9, :-]\+ERROR' "$file"