Regex awk a la interfaz de Cisco

Regex awk a la interfaz de Cisco

Me gustaría saber si tengo alguna expresión regular Sed/Grep o Awk para analizar la sección de la interfaz de Cisco, con un atributo específico, como el siguiente.

Contenido del archivo.txt

!
interface FastEthernet0/1
 no ip unreachables
!
interface FastEthernet0/2
 no ip proxy-arp
!

Guion:

#!/bin/bash
VALUE="no ip proxy-arp"
awk -v RS='!\n' -v PATTERN=${VALUE} '/$PATTERN/' file.txt | awk '/^interface/';
exit 0

El problema es que cuando ejecuto la línea directamente desde el shell, funciona, pero cuando ejecuto desde el script, no funciona.

Al ejecutar con bash -x, puedo ver que awkno se puede reemplazar el valor de la variable.

Alguna sugerencia ?

Respuesta1

Es difícil creer que esto funcione en tu caparazón. No obstante, este código contiene varios errores y también tiene un enfoque incorrecto en mi humilde opinión.

awk espera una cadena entre //no una variable. Estas son expresiones regulares constantes. Entonces, o haces que el shell coloque la variable allí o usas ~.

Su enfoque con las correcciones:

awk -v RS='!\n' -v PATTERN="${VALUE}" '$0 ~ PATTERN' file.txt | 
  awk '/^interface/'

Me sorprende que esto funcione. Según la documentación, esperaba que, debido a la configuración de RS, apareciera un "!" se imprimiría. Sin embargo, considero mejor este:

awk -v PATTERN="${VALUE}" \
  '$0 ~ PATTERN { print previousline; }; { previousline=$0; }' file.txt

o con patrón codificado

awk '/no ip proxy-arp/ { print previousline; }; { previousline=$0; }' file.txt

o con la concha escribiendo el patrón

awk /"$VALUE"/' { print previousline; }; { previousline=$0; }' file.txt

Respuesta2

eco "!
interfaz FastEthernet0/1
 sin ip inalcanzables
!
interfaz FastEthernet0/2
 sin ip proxy-arp
" | pcregrep -M "^interfaz .*0/1\n (.*\n)!"

resultado:

interfaz FastEthernet0/1
 sin ip inalcanzables

información relacionada