
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 awk
no 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