Awk ist eine leistungsfähige Datenverarbeitungs-Programmiersprache, die in fast jedes * nix-System integriert ist. Es sieht wie eine allgemeine Programmiersprache auf der Oberfläche aus, ist aber so gebaut, dass es Eingaben und Aktionen basierend auf dieser Eingabe ausführt. Wenn Sie Text basierend auf bestimmten Bedingungen verarbeiten müssen, wird awk fast immer die Aufgabe schneller erledigen als eine allgemeine Sprache wie C. Es wird auch interpretiert, so dass Sie den langatmigen Kompilierungs- und Debugging-Prozess kompilierter Sprachen vermeiden.

Ein zusätzlicher Spaßfaktor : Der seltsame Name des Programms ist eine Initialisie- rung der Namen seiner Programmierer: Alfred A ho, Peter W einberger und Brian K ernighan

Awks grundlegende Syntax

Wenn awk in der Befehlszeile aufgerufen wird, folgt es dem folgenden Grundmuster:

 Muster {Aktion} Datei Muster {Aktion} Datei ... 

Awk führt die Aktion immer dann aus, wenn das Muster in der angegebenen Datei übereinstimmt. Wenn Sie keine Datei angeben, wird awk auf der Standardausgabe ausgeführt. Beim Anpassen von Mustern kann awk sowohl reguläre Ausdrücke als auch programmatische Eingaben verwenden. Betrachten wir dieses grundlegende Beispiel unten:

 awk '/ com / {print $ 0}' E-Mails 

Dieses einzeilige Programm druckt jede Zeile aus der Datei "E-Mails", die die Zeichen com . In awk $0 bezieht sich auf die aktuelle Zeile, die auch das Standardverhalten ist. Die Zeile hätte ohne $0, geschrieben werden $0, und hätte genauso funktioniert.

Druckfelder

Da awk Feldtrennzeichen identifizieren und analysieren kann, ist es nützlich, bestimmte Spalten oder Zeilen von Daten auszudrucken. Wir werden die Datei "/ etc / passwd" für dieses Beispiel verwenden.

 awk -F: "'{print $ 1}' / etc / passwd 

Dieses einzeilige Programm macht ein paar Dinge. Das Flag -F zeigt an, dass das nächste Zeichen (in diesem Beispiel) als Feldtrennzeichen interpretiert werden soll. Awk sie druckt das erste Feld, angegeben durch $1 .

Wir können auch mehrere Felder gleichzeitig drucken, indem Sie die Felder der Reihe nach angeben:

 awk -F: "{print $ 4" "$ 5}" / etc / passw 

Es erzeugt eine Ausgabe, die wie folgt aussieht.

Dies druckt das vierte und fünfte Feld der passwd Datei mit einem Leerzeichen zwischen ihnen. Beachten Sie, dass das Leerzeichen zwischen doppelten Anführungszeichen steht. Dies gibt es als ein Literalzeichen innerhalb des Druckbefehls an, so dass es wie geschrieben gedruckt wird. Wir können auch kompliziertere Literale hinzufügen, um unsere Ausgabe zu bereinigen:

 awk -F: "{print" process: "$ 5" \ t \ t "" Verzeichnis: "$ 6}" / etc / passwd 

Dadurch wird die Ausgabe mit Etiketten zur Identifikation gedruckt. Und wir können all dies mit einem Caret (>) in eine neue Datei ausgeben.

 awk -F: "'{print" Prozess: "$ 5" \ t \ t "" Verzeichnis: "$ 6}" / etc / passwd> processs.txt 

Wir können kombinieren, was wir bisher kennen, um Daten umfassend zu verarbeiten. Beispielsweise können Sie mit regulären Ausdrücken alle Zeilen eines Dokuments drucken, das eine gültige US-Telefonnummer enthält.

 awk '/^(\+{1, 2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4 } $ / {print} Kontakte 

Erweitern des Awk-Kommandos

Awk kann Informationen auch unter Verwendung einer Vielzahl von Operanden verarbeiten. Dazu gehören Standardoperanden wie ==, <, >, <=, >= und != Sowie awk-spezifische Operanden ~ und !~, "Übereinstimmungen" bzw. "stimmt nicht überein" bedeuten. Diese Operanden werden verwendet, wenn reguläre Ausdrücke mit Boolescher Logik verglichen werden, sowie mit mehr standardmäßigen programmatischen Phrasen.

Awk-Befehlsbeispiele

 awk 'Länge ($ 0)> 80' Daten 

Druckt alle Zeilen, die länger als achtzig Zeichen sind, in der Datei "data". Beachten Sie das Fehlen einer print-Anweisung: Wenn keine bestimmte Aktion ausgeführt wird, druckt awk die vollständige Zeile, sobald ein Muster übereinstimmt.

 $ 1 == "Benutzer" {print} 

Gibt alle Zeilen aus, bei denen das erste Feld der Zeichenfolge "user" entspricht. Ohne a -F verwendet awk Leerzeichen als Standardfeldtrennzeichen. Beachten Sie auch, dass awk und die Datei nicht angegeben sind. Dies ist für die Verwendung in Skripten in separaten Dateien vorgesehen, wie unten beschrieben.

 $ 5 ~ / root / {print $ 3} 

Gibt das dritte Feld aus, wenn das fünfte Feld mit dem regulären Ausdruck /root/ übereinstimmt.

 {if ($ 5! ~ / root /) {print $ 3}} 

Wenn Feld 5 nicht mit /root/ übereinstimmt, drucken Sie Feld drei. Dies verwendet die C-like if Anweisung, die auch mit awk kompatibel ist. Dieses Format ermöglicht mehr Flexibilität für Programmierer, die mit allgemeinen Sprachen vertraut sind.

Skripte in Dateien speichern

Awk-Skripte können auch in Dateien gespeichert werden, mit denen Sie komplexere Programme speichern können:

 awk -f ~ / scripts / programm.awk Daten 

Wenn awk das Flag -f verwendet, führt awk das Skript im angegebenen Dateipfad aus, nämlich program.awk . Die Befehle in diesem Programm werden die Datei "data" verarbeiten.

Aktionen können auch vor und nach dem Programm mit BEGIN und END :

 BEGIN {FS = ":"} # gibt an, dass: das Feldtrennzeichen für das Programm ist. #operations END {print "Du bist fertig"} # druckt eine freudige Nachricht für den Benutzer 

Wie Sie oben sehen können, startet das # -Symbol einen Kommentar, der bis zum Ende der Zeile anhält.

Fazit

Dieser Leitfaden behandelt nur die grundlegendsten Elemente von awk. Es gibt viel mehr zu bauen und zu erforschen darüber hinaus. Untersuchen Sie die GNU-Dokumentation für awk oder The Awk Programming Language und das awk-Lehrbuch, das von den Entwicklern des Programms geschrieben wurde.