다음 줄에 특정 일치 항목이없는 경우에만 줄을 인쇄하십시오.


12

완료되지 않은 기록 된 활동에 대한 로그 파일을 검색하려고합니다. 예를 들어, "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있지만, 많은 성공이 없었어요. 나는 그것이 그 도구 중 하나와 함께 할 수 있으리라 믿고있어,하지만 내 grepawk절단 고급 없습니다.

여기에 필요한 결과를 제공하기 위해 빠르고 안정적 grep이거나 awk패턴을 찾고 있습니다.


grep + awk로는 쉽지 않다고 생각하지만 왜 그 일을하는지 설명 할 수 있습니까? 성공 여부와 같은 모든 실행중인 활동의 결과?
데이지

@ warl0ck, "완료되지 않은"을 찾고 있습니다.
PattMauler

답변:


10

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를 보였다 무엇을 추적합니다.


"Starting ..."및 "Completed ..."로그 행이 인접 / 순차적이지 않은 상황을 수용하는 것처럼 보이기 때문에 이것은 실제로 잘 작동합니다. @Thor 감사합니다!
PattMauler

천만에요. ID 만 저장하고 조회 시간이 O (1)이므로 (거의) 임의 크기 입력으로 효율적으로 작동해야합니다.
Thor

좋은. @RobertL ( unix.stackexchange.com/a/243550/135943 ) 에서 배운 것처럼 배열 요소를 만들기 위해 값을 지정할 필요가 없습니다. 따라서 대신을 I[$5] = 1사용할 수 있습니다 I[$5]. (값에 신경 쓰지 않고 요소를 존재 하게 만들고 단순히 이름을 지정하면됩니다.)
Wildcard

@Wildcard : 맞아요. 그러나 OP의 질문과 출력과 같은 grep을 검토 한 후에는 전체 줄을 기억하고 마지막에 출력하는 것이 더 적절합니다.
Thor

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

이렇게하면 완료된 문자열과 일치하는 행이 뒤에 오는 모든 입력 행이 출력에서 ​​삭제 됩니다 .


2

GNU sed로 어떻게 할 수 있습니까?

sed -r 'N; /([0-9]+)\n\w+\s+\1/d; P; D' infile
  • N 패턴 공간으로 한 줄을 더 읽습니다.
  • 일치 정규 표현식은 패턴 공간이 삭제되고 ( d)주기가 다시 시작 되는 경우 동일한 ID가 있는지 확인합니다 .
  • 일치하지 않으면 패턴 공간의 첫 번째 줄을 인쇄하고 ( P) 삭제하십시오 ( D).

여기서 확장 된 것을 볼 수 없습니다 ... -r필요하지 않습니까?
Louis Maddox

1
@lmmx : 그렇지 않으면 캡처 그룹을 이스케이프해야하고 +수량 자에 대해서도 동일하므로 필요합니다 .
Thor

그래! 나는 그것을 수정 명확히, 그것은 필요하지 않았다 덕분에 들었다
루이 매덕스를

1

설치가 pcregrep을 지원하면 여러 줄 (-M) 옵션이 유용합니다.

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

ID 33367의 활동 시작

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.