AWK 또는 SED에서 일치하는 정규식 아래 줄을 인쇄하는 방법

AWK 또는 SED에서 일치하는 정규식 아래 줄을 인쇄하는 방법

여러 스위치와 부팅 변수가 포함된 파일이 있습니다.

lax1-sw0101#show boot
---------------------------
Switch 1
---------------------------
Current Boot Variables:
BOOT variable does not exist

Boot Variables on next reload:
BOOT variable does not exist
Manual Boot = no
Enable Break = no
Boot Mode = DEVICE
iPXE Timeout = 0
lax1-sw0101#

lgb1-sw0102#show boot
---------------------------
Switch 1
---------------------------
Current Boot Variables:
BOOT variable does not exist

Boot Variables on next reload:
BOOT variable does not exist
Manual Boot = no
Enable Break = no
Boot Mode = DEVICE
iPXE Timeout = 0
lgb1-sw0102#

las-sw0101#show boot
---------------------------
Switch 1
---------------------------
Current Boot Variables:
BOOT variable does not exist

Boot Variables on next reload:
BOOT variable = flash:/cat9k_iosxe.bin;
Manual Boot = no
Enable Break = no
Boot Mode = DEVICE
iPXE Timeout = 0
las-sw0101#

"시작 변수가 존재하지 않음" 때문에 "다음 다시 로드 시 시작 변수:"가 있는 스위치만 필터링하고 호스트 이름을 인쇄해야 합니다.

Output:
lax1-sw0101#
Boot Variables on next reload:  
BOOT variable does not exist   

lgb1-sw0102#
Boot Variables on next reload:
BOOT variable does not exist

줄 사이 인쇄, n번째 줄에서 인쇄와 같은 awk/sed 솔루션을 시도했는데 가장 가까운 솔루션은 아래와 비슷한 솔루션이었지만 아래 줄을 인쇄할 수 없습니다.

awk '/#/{a=$0}/Boot Variables on next reload/{print a"\n"$0}'

답변1

이제 찾고 있는 것이 무엇인지 알았으므로 awk 상태 시스템을 사용하여 해당 이름을 인쇄하는 것이 좋습니다.

awk '/^Boot Variables on next reload:$/ { p=1 } 
     /^BOOT variable does not exist$/ && 1==p { p=2 } 
     /#$/ { if (2 == p) print; p=0; }' 
  input

이는 플래그 값을 사용하여 p처음으로 표시되는지 여부를 나타냅니다 Boot Variables on next reload:.그 다음에이전에 본 것처럼 줄 끝에 a가 BOOT variable does not exist있으면 현재 플래그 값을 확인합니다. 값이 2인 경우에만 (호스트 이름) 줄이 인쇄됩니다. #그럼에도 불구하고 상태를 다시 시작으로 재설정합니다.

정적 텍스트를 인쇄해야 하는 경우 해당 텍스트를 print명령문에 쉽게 추가할 수 있습니다.

관련 정보