Regex awk zur Cisco-Schnittstelle

Regex awk zur Cisco-Schnittstelle

Ich würde gerne wissen, ob es einige Sed/Grep- oder Awk-Regex gibt, um den Cisco-Schnittstellenabschnitt mit bestimmten Attribut wie unten zu analysieren.

Inhalt der Datei.txt

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

Skript:

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

Das Problem besteht darin, dass es funktioniert, wenn ich die Zeile direkt von der Shell aus ausführe, aber nicht, wenn ich sie von einem Skript aus ausführe.

Beim Ausführen von bash -xkann ich sehen, dass awkder Variablenwert nicht ersetzt werden kann.

Irgendwelche Vorschläge ?

Antwort1

Kaum zu glauben, dass das in deiner Shell funktioniert. Trotzdem enthält dieser Code mehrere Fehler und hat meiner Meinung nach auch den falschen Ansatz.

awk erwartet einen String zwischen und //keine Variable. Dies sind konstante reguläre Ausdrücke. Sie lassen also entweder die Shell die Variable dort einfügen oder Sie verwenden ~.

Ihr Vorgehen bei Korrekturen:

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

Ich bin überrascht, dass das funktioniert. Aus der Dokumentation hatte ich erwartet, dass aufgrund der Einstellung von RS ein unerwünschtes "!" gedruckt wird. Ich halte das hier jedoch für besser:

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

oder mit fest codiertem Muster

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

oder mit der Shell das Muster schreiben

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

Antwort2

echo "!
Schnittstelle FastEthernet0/1
 keine IP nicht erreichbar
!
Schnittstelle FastEthernet0/2
 kein IP-Proxy-ARP
" | pcregrep -M "^Schnittstelle .*0/1\n (.*\n)!"

Ergebnis:

Schnittstelle FastEthernet0/1
 keine IP nicht erreichbar

verwandte Informationen