如何在 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

我嘗試過一些 awk/sed 解決方案,例如在行之間列印、從第 n 行列印,我能得到的最接近的是與下面類似的解決方案,但我無法列印下面的一行

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 exist;當我們看到一行#末尾有 a 時,我們檢查當前的標誌值;僅當值為 2 時,才會列印該 (hostname) 行。不管怎樣,我們接著將狀態重置回開始的狀態。

如果您需要列印靜態文本,可以輕鬆地將其新增至print語句。

相關內容