다음 줄에 특정 일치 항목이 포함되지 않은 경우에만 줄을 인쇄합니다.

다음 줄에 특정 일치 항목이 포함되지 않은 경우에만 줄을 인쇄합니다.

완료되지 않은 기록 활동에 대한 로그 파일을 검색하려고 합니다. 예를 들어 "ID 1234로 활동 시작 중..."을 기록하고 성공하면 다음 줄은 "활동 1234 완료"가 됩니다.

해당 "완료" 줄이 뒤에 나오지 않는 "시작..." 줄을 가져오려고 합니다.

로그 파일 예

Starting activity for ID 1234
ID 1234 completed successfully
Starting activity for ID 3423
ID 3423 completed successfully
Starting activity for ID 9876
ID 9876 completed successfully
Starting activity for ID 99889
ID 99889 completed successfully
Starting activity for ID 10011
ID 10011 completed successfully
Starting activity for ID 33367
Starting activity for ID 936819
ID 936819 completed successfully

이 예에서는 다음과 같은 출력을 원합니다.

Starting activity for ID 33367

...그 뒤에 "완료" 줄이 없기 때문입니다.

나는 이것을 사용하여 많은 성공을 grep거두지 못했습니다 . awk이 도구 중 하나를 사용하면 가능하다고 생각하지만 내 grep능력은 awk아직 발전하지 않았습니다.

나에게 필요한 결과를 제공할 빠르고 안정적인 grep모드를 찾고 있습니다 .awk

답변1

대안은 다음 과 같습니다 awk.

awk '
  /^Starting/ { I[$5] = $0                  }
  /^ID/       { delete I[$2]                }
  END         { for (key in I) print I[key] }
' infile

산출:

Starting activity for ID 33367

연관 배열은 I표시된 ID를 추적합니다.

답변2

sed '$!N;/\n.*completed/d;P;D' <input

그러면 문자열과 일치하는 행이 뒤에 오지 않는 모든 입력 행이 출력에서 ​​제거됩니다.충분히.

답변3

GNU sed를 사용하여 이를 수행하는 방법은 다음과 같습니다.

sed -r 'N; /([0-9]+)\n\w+\s+\1/d; P; D' infile
  • N패턴 공간에서 한 줄을 더 읽습니다.
  • 일치하는 정규식은 동일한 ID가 있는지 확인하고, 그렇다면 패턴 공간( d)을 제거하고 루프를 다시 시작합니다.
  • 일치하는 항목이 없으면 패턴 공간의 첫 번째 줄을 인쇄하고( P) 삭제합니다( D).

답변4

설치에서 pcregrep을 지원하는 경우 여러 줄(-M) 옵션이 유용합니다.

pcregrep -M -o '\AStarting activity for ID (\d+)\n(?!ID \1)' t.z

ID 33367로 활동 시작

관련 정보