
我有一個包含多個開關和引導變數的檔案。
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
語句。