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文に簡単に追加できます。

関連情報