아래는 내 검사 스크립트의 추출된 출력입니다. 호스트 이름과 오류만 인쇄하고 싶습니다. 호스트에 오류가 없으면 호스트 이름 항목도 삭제합니다. 내가
사용하고 싶은 논리는 다음 행이 "NOT OK"와 일치하지 않으면 기존 행을 삭제하는 것입니다. 또는 ... 어떤 유틸리티라도 패턴 일치에 적합할 것입니다.awk
sed
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
( 패턴 공간을 제거할 $
때 d
la 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 ^--$