
Gostaria de saber se existe algum regex Sed/Grep ou Awk para analisar seção de interface Cisco, com atributo específico, como abaixo.
Conteúdo do arquivo.txt
!
interface FastEthernet0/1
no ip unreachables
!
interface FastEthernet0/2
no ip proxy-arp
!
Roteiro:
#!/bin/bash
VALUE="no ip proxy-arp"
awk -v RS='!\n' -v PATTERN=${VALUE} '/$PATTERN/' file.txt | awk '/^interface/';
exit 0
O problema é que quando executo a linha diretamente do shell, funciona, mas quando executo a partir do script, não funciona.
Executando com bash -x
, posso ver que awk
não é possível substituir o valor da variável.
Alguma sugestão ?
Responder1
Difícil acreditar que isso funcione no seu shell. No entanto, este código contém vários erros e também tem a abordagem errada IMHO.
awk espera uma string entre //
não uma variável. Estas são expressões regulares constantes. Então você faz o shell colocar a variável lá ou usa ~
.
Sua abordagem com correções:
awk -v RS='!\n' -v PATTERN="${VALUE}" '$0 ~ PATTERN' file.txt |
awk '/^interface/'
Estou surpreso que isso funcione. Pela documentação eu esperava que devido à configuração do RS um "!" seria impresso. No entanto, considero este melhor:
awk -v PATTERN="${VALUE}" \
'$0 ~ PATTERN { print previousline; }; { previousline=$0; }' file.txt
ou com padrão codificado
awk '/no ip proxy-arp/ { print previousline; }; { previousline=$0; }' file.txt
ou com o shell escrevendo o padrão
awk /"$VALUE"/' { print previousline; }; { previousline=$0; }' file.txt
Responder2
eco "! interface FastEthernet0/1 sem ip inacessível ! interface FastEthernet0/2 sem ip proxy-arp " | pcregrep -M "^interface .*0/1\n (.*\n)!"
resultado:
interface FastEthernet0/1 sem ip inacessível