Cómo imprimir una línea debajo de la expresión regular correspondiente en AWK o SED

Cómo imprimir una línea debajo de la expresión regular correspondiente en AWK o SED

Tengo un archivo que contiene varios modificadores y las variables de arranque.

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#

Necesito filtrar solo los conmutadores que tienen las "Variables de arranque en la próxima recarga:" como "Las variables de arranque no existen", y también imprimir el nombre del host.

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

He probado algunas soluciones awk/sed como imprimir entre líneas, imprimir desde la enésima línea, lo más cerca que puedo llegar es la similar a la siguiente, pero no puedo imprimir una línea a continuación

awk '/#/{a=$0}/Boot Variables on next reload/{print a"\n"$0}'

Respuesta1

Como sabes lo que estás buscando, te sugiero que simplemente imprimas los nombres correspondientes con una máquina de estado 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

Esto simplemente usa un valor de bandera, ppara indicar si lo hemos visto por primera vez Boot Variables on next reload:.entoncesvisto BOOT variable does not exist; cuando vemos una línea con a #al final de la línea, verificamos el valor de la bandera actual; solo si el valor es 2, imprima esa línea (nombre de host). De todos modos, luego restablecemos el estado al principio.

Si necesita imprimir el texto estático, es una adición fácil a la printdeclaración.

información relacionada