AWK または SED で一致する正規表現の 1 行下に印刷する方法

AWK または SED で一致する正規表現の 1 行下に印刷する方法

いくつかのスイッチとブート変数を含むファイルがあります。

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ソリューションを試しましたが、私が達成できる最も近いものは以下のようなものでしたが、1行下を印刷することはできません。

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:それから行末にBOOT variable does not exista がある行を見つけたら、現在のフラグ値をチェックします。値が 2 の場合のみ、その (ホスト名) 行を出力します。いずれの場合も、状態を最初に戻します。#

静的テキストを印刷する必要がある場合は、ステートメントに簡単に追加できますprint

関連情報