Regex awk para interface Cisco

Regex awk para interface Cisco

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 awknã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

informação relacionada