如何在 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语句中。

相关内容