다음 줄이 다른 패턴과 일치하지 않으면 패턴과 일치하는 줄을 삭제하세요.

다음 줄이 다른 패턴과 일치하지 않으면 패턴과 일치하는 줄을 삭제하세요.

아래는 내 검사 스크립트의 추출된 출력입니다. 호스트 이름과 오류만 인쇄하고 싶습니다. 호스트에 오류가 없으면 호스트 이름 항목도 삭제합니다. 내가
사용하고 싶은 논리는 다음 행이 "NOT OK"와 일치하지 않으면 기존 행을 삭제하는 것입니다. 또는 ... 어떤 유틸리티라도 패턴 일치에 적합할 것입니다.
awksed

NSAS_HOST:d01-emsacssb01
NSAS_HOST:d01-emsacssb02
NSAS_HOST:emsacssbcon01
NOT OK main load processes
NOT OK 5.3% AXConfigurator
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.bak is not UP, but ifcfg-eth1.bak sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:emsacssb03
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:emsacsnb01
NSAS_HOST:emsacsnb02
NSAS_HOST:d02-emsacssb01
NSAS_HOST:d02-emsacssb02
NSAS_HOST:b2bcms01
NSAS_HOST:b2bcms02
NSAS_HOST:d02-b2bpgdb01
NOT OK bond0: device speed not determined
NOT OK bond1: device speed not determined

예상되는 결과:

NSAS_HOST:emsacssbcon01
NOT OK main load processes
NOT OK 5.3% AXConfigurator
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.bak is not UP, but ifcfg-eth1.bak sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:emsacssb03
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:d02-b2bpgdb01
NOT OK bond0: device speed not determined
NOT OK bond1: device speed not determined

기본적으로:
1. 용어를 검색합니다. NSAS_HOST
2. 다음 줄이 있는지 확인합니다 NOT OK. 있는 경우 다음 NSAS_HOST
3줄에 도달할 때까지 줄이 인쇄됩니다 . NOT OK존재하지 않으면 해당 줄을 삭제 하십시오 NSAS_HOST.

답변1

sed이 작업 에 사용할 수 있는 것 :

sed '/NSAS_HOST/{$d;N;/\n.*NOT OK/!D;}' infile

N이는 일치하는 모든 줄의 추가 줄을 가져옵니다 NSAS_HOST( 패턴 공간을 제거할 $dla t 줄은 제외). 패턴 공간의 두 번째 라인이 일치하지 않으면 NOT OK개행 D문자까지 삭제(즉, 패턴 공간의 첫 번째 라인 삭제)하고 루프를 다시 시작합니다.

답변2

sed로:

sed -ne '/NSAS_HOST/{N;/NOT OK/{p}};/NSAS_HOST/!p' FILE 

산출:

NSAS_HOST:emsacssbcon01
NOT OK main load processes
NOT OK 5.3% AXConfigurator
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.bak is not UP, but ifcfg-eth1.bak sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:emsacssb03
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:d02-b2bpgdb01
NOT OK bond0: device speed not determined
NOT OK bond1: device speed not determined

답변3

GNU grep에서 사용하기 매우 간단함--no-group-separator옵션옵션 외에도 -B:

grep --no-group-separator -B1 ^"NOT OK" log 

또는 그렇지 grep않은 --no-group-separator경우 그룹 사이의 행을 -B제거합니다 .--

grep -B1 ^"NOT OK" log | grep -v ^--$

관련 정보