오류를 일으키는 프로세스 라인에 대해서만 grep

오류를 일으키는 프로세스 라인에 대해서만 grep

여러 프로세스로 실행되는 서비스가 있고 모든 로그가 하나의 거대한 로그를 형성합니다(이유는 묻지 마세요). 다음과 같습니다.

process1: bla bla bla
process2: ha ha ha
process3: tarara **error_has_happened**
process3: details of the error here
process1: bla bla bla
process3: more details of the error here
process2: ha ha ha

이 오류는 모든 프로세스에서 발생할 수 있으므로 grep이 모든 프로세스에 대해 이 오류를 찾도록 하고 싶습니다.

process3: tarara **error_has_happened**
process3: details of the error here
process3: more details of the error here

그래서 기본적으로 감지됨오류가 발생했습니다그리고 그것이 발생하는 프로세스를 설명하고 해당 프로세스에서 다음 N 줄만 인쇄합니다. 이는 다른 프로세스의 오류 세부 정보 로그가 인터리브되지 않는다는 가정하에 이 오류가 발생하는 모든 프로세스에 대해 발생해야 합니다.

grep만 사용하여 이 작업을 수행할 수 있습니까? 어떻게?

답변1

다음을 수행할 수 있습니다.

grep "error_has_happened" -A3 logfile.log

여기서 3은 error_has_happened가 발생한 후 표시될 줄 수입니다. 그러나 여기에는 오류를 보낸 프로세스의 출력뿐만 아니라 다른 프로세스 출력도 표시됩니다.

빠른 테스트에서 나에게 도움이 된 더 자세한 명령은 다음과 같습니다.

grep "error_has_happened" logfile.log | cut -d : -f1 | sort -u |
  while IFS= read -r process; do
    grep "^$process:" logfile.log |
      grep -A3 "error_has_happened"
  done

답변2

를 사용하면 awk오류 줄과 프로세스에 따른 10줄이 인쇄됩니다.

awk -F : -v N=10 '/error_has_happened/ {n[$1] = N+1}
                  n[$1]-- > 0' logfile.log

관련 정보