로그 파일을 추적하여 정규식 패턴과 일치하는 텍스트 블록만 인쇄하고 싶습니다 .*\n.*\nABC(.*\n){1-6}XYZ
. 내 정규식이 이미 잘못된 경우 다음 예와 일치시키고 싶습니다.
TIMESTAMP HERE
LOG ENTRY HEADER
ABC
STUFF
...
STUFF
XYZ
아니면 내가 뭘 할래?진짜like는 문자열 "ZZZ"가 일치 항목 어디에도 나타나지 않는 경우에만 위 항목을 일치시키는 것입니다.
내 해결책은 다음을 수행하는 것이었습니다.
tail -f file | egrep --line-buffered -B 2 -A 6
하지만 분명히 그것은 내가 원했던 것보다 훨씬 더 많은 성과를 거두었습니다. 패키지를 설치할 수 있는 옵션도 없지만 패키지가 있고 사용 가능 awk
합니다 sed
.
답변1
"TIMESTAMP"에서 "XYZ"까지 임의의 블록을 선택하고 블록 뒤에 구분 기호로 NUL을 도입하여 필터링 한 다음 끝에서 NUL 바이트를 제거하는 sed
등 다른 도구를 사용하여 필터링할 수 있습니다 .grep
tail -f file |
sed -n '/TIMESTAMP/,/XYZ/{/XYZ/s/$/\x00/;p}' |
grep -z 'ABC' |
grep -z -v 'ZZZ' |
tr -d '\x00'
답변2
당신이 할 수 있는 일은 시작과 끝 패턴을 결정하는 것입니다. 예를 들어, 이를 달성하기 위해 TIMESTAMP HERE
and 를 사용 XYZ
하고 그 사이의 모든 줄을 찾기 위해 sed를 사용하겠습니다.
sed -n '/^TIMESTAMP HERE/,/^XYZ/p' logfile.txt
답변3
고쳐 쓰다:
tail -f log | sed '/\n/!N;N;/\nABC$/!D;N;N;N;N;N;N;/ZZZ/d'
템플릿과 일치하는 줄을 표시합니다 ABC
. 템플릿이 없으면 처음 2줄과 다음 6줄을 표시합니다.ZZZ
버퍼에는 항상 3개의 라인이 있습니다. 마지막 항목을 확인해 보겠습니다. 일치하는 항목이 없으면 첫 번째 항목이 제거되고 실행이 스크립트의 시작 부분으로 이동됩니다. 일치하는 항목이 있으면 행을 6개 더 추가하세요. 인쇄 결정은 패턴 일치를 기반으로 이루어집니다 ZZZ
.
불일치: 패턴이 레코드 블록의 끝과 일치해야 한다고
가정합니다 . XYZ
그 다음에:
tail -f | sed ':1;N;/XYZ/!b1;/ZZZ/d'
여기서는 버퍼링되지 않은 출력이 필요하지 않다고 생각하지만 -u
플래그는 sed
스트림 편집기에서 이 기능을 제공합니다.
레코드 블록 시작 부분에 패턴을 입력할 수도 있습니다.
tail -f | sed '/TIMESTAMP/!d;:1;N;/XYZ/!b1;/ZZZ/d'
위 스크립트는 레코드의 시작부터 끝까지 모든 행을 SED 편집기 버퍼(패턴 공간)에 추가하고 이를 템플릿과 일치시켜 ZZZ
전체 레코드를 삭제할지 인쇄할지 여부를 결정합니다.
또는 로그 청크에 동일한 수의 줄이 포함되어 있으면 egrep을 사용할 때 필요한 대로 정확히 계산하고 표시할 수 있습니다.
카운터로 더하기 + 기호를 선택해 보겠습니다. 이 예에서는 5까지 계산하지만 다음 템플릿에서 변경할 수 있습니다 +\{5\}
.
tail -f log | sed ':1;x;s/$/+/;/+\{5\}/!{x;N;b1};s/.*//;x'
템플릿을 통해 계정의 시작 부분을 추가하고 삭제할 수도 있습니다.
tail -f log | sed '/TIMESTAMP/!d;:1;x;s/$/+/;/+\{5\}/!{x;N;b1};s/.*//;x;/ZZZ/d'
카운터는 이렇게 작동합니다. SED 편집기에는 패턴 공간과 홀드 공간이라는 두 개의 버퍼가 있습니다. 문자열이 패턴 공간에 기록됩니다. 이 x
명령은 두 버퍼의 내용을 변경합니다. 예약된 공간 끝에 더하기 기호를 쓰고 숫자를 확인한 다음 패턴이 5와 일치하면 내용을 인쇄하고, 그렇지 않으면 다음 줄을 추가하고 카운터를 증가시킵니다. 5개 행이 일치하면 카운터를 재설정하고 프로세스를 반복합니다.