Führen Sie auf alle Dateien in einem Verzeichnis, die Behandlung jedes einzeln, mit AWK
Möchte ich laufen ein AWK-Skript für jede Datei in einem Verzeichnis, aber der AWK-Befehl ausgeführt werden muss, die nur im Datei - das heißt, es sucht zwischen einem definierten RS und gibt, was es soll, aber ich muss es beenden, wenn er erreicht das Ende der Datei und beginnen Sie erneut am Anfang der nächsten Datei.
Habe ich diese laufen die arbeiten auf jede Datei einzeln:
awk '!/value1|value2/&& NF {print FILENAME " - " RS,$1}' RS="value" file1 > result.txt
Aber ist die Ausgabe nicht korrekt ist, zu sagen, wenn man es anwendet, um jede Datei in einem Verzeichnis mit
find . -type f | awk ... file1 > result.txt
Wie würde ich es bekommen, jede Datei einzeln, sondern fügen Sie die Ergebnisse in die gleiche Datei? Ich habe keine Ahnung, leider. Ich denke, es ist, indem Sie jede Datei in eine variable und AWK anschauen, aber ich bin nicht sicher, wie es zu tun.
Datei Datei1:
interface Vlan3990
ip address 172.17.226.23 255.255.255.254
Datei file2:
version 12.2
ip tacacs source-interface Loopback99
ip vrf test
description xx
interface Loopback99
description Management Loopback
interface Loopback100
shutdown
- Ausgang
find . -type f | xargs awk '!/description|shutdown/&& NF {print FILENAME " - " RS,$1}' RS="interface" | more
./file1 - interface Vlan3990
./file2 - interface version
Ich bin nicht sicher, wo der output "- Schnittstelle in der version' ist aus...
- shell-Skript aufrufen awk in jeder Datei einzeln? oder BEGINNEN/BEGINFILE/ENDE/ENDFILE umgesetzt als nötig?
- ja - so sieht es bei einer Datei, die ausgeführt wird der Befehl beendet, dann öffnet die nächste Datei im Verzeichnis, führt den Befehl aus, Stoppt etc... nicht sicher, wie es zu tun, da gibt es 300+ Dateien in das Verzeichnis
- Können Sie erläutern, wie der Satz aber die Ausgabe ist nicht korrekt? Was sind die Unterschiede zwischen dem, was Sie bekommen und was Sie erwarten?
- in jeder Datei gibt es eine Letzte vorkommen der RS, so sieht es aus und gibt zwischen dem letzten auftreten in der ersten Datei und die erste vorkommen der zweiten Datei...
- Klären Sie, was Sie versuchen zu tun, probieren Sie die Eingabe und erwartete Ausgabe, wie Sie zu sein scheinen zu Fragen, für ein workaround für ein problem, das nicht existiert.
- ok. Dank ed. eine Sek.
- Ist "output" über die Ausgabe, die Sie wollen oder die Ausgabe, die Sie aktuell bekommen, dass Sie nicht wollen? Wenn die letztere, welche Ausgabe wollen Sie?
- Die Ausgabe "interface version", durch die Art und Weise, kommt von dir Einstellung RS="version" und drucken Sie dann RS, gefolgt von $1, wenn $1 ist "version" auf die erste Zeile von Datei2 erhalten Sie durch die Ausgabe.
- ok... ich würde erwarten, um zu sehen, eine Ausgabe aller Zeilen, beginnend mit "Schnittstelle", die nicht über die Zeilen, beginnend mit entweder 'shutdown' oder 'Beschreibung' nach, bis die nächste Instanz eine Zeile beginnend mit 'interface'. im wesentlichen ist es cisco-config - und ich möchte es drucken alle Schnittstellen, die nicht heruntergefahren und nicht eine Beschreibung haben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen diese, Ihre 2 geschrieben von input-Dateien:
Ist, dass das, was du suchst? Beachten Sie, dass es gawk-spezifische (mit freundlicher Genehmigung von
ENDFILE
), die ich annehmen, ist in Ordnung, da der sample-Befehl, den Sie geschrieben ist auch gawk-spezifisch, aber wenn das ist ein Problem, fügen Sie einfach einen test für die FNR==1, und ändern Sie ENDFILE zu ENDE:Nur für das aktuelle Verzeichnis:
Wenn Sie brauchen, um Rekursion in Unterverzeichnisse:
In beiden Fällen, Sie wahrscheinlich sollte setzen Sie
result.txt
in ein anderes Verzeichnis. Ansonsten, es wird abgestimmt und verwendet als input-Datei. Oder verwenden Sie ein Platzhalterzeichen, das entspricht nur die gewünschten Dateien, und nicht mitresult.txt
.