
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 -x
kann ich sehen, dass awk
der 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