Как напечатать одну строку под соответствующим регулярным выражением в 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:,затемseen BOOT variable does not exist; когда мы видим строку с a #в конце строки, то мы проверяем текущее значение флага; только если значение равно 2, печатаем эту (hostname) строку. Независимо от этого, мы затем сбрасываем состояние обратно в начало.

Если вам необходимо напечатать статический текст, это можно легко добавить в оператор print.

Связанный контент