Awk ist ein leistungsstarkes Textparsing-Tool für Unix und Unix-ähnliche Systeme, aber da es über programmierte Funktionen verfügt, mit denen Sie allgemeine Parsing-Aufgaben ausführen können, wird es auch als Programmiersprache betrachtet . Wahrscheinlich werden Sie Ihre nächste GUI-Anwendung nicht mit awk entwickeln, und es wird wahrscheinlich nicht den Platz Ihrer Standard-Skriptsprache einnehmen, aber es ist ein leistungsstarkes Dienstprogramm für bestimmte Aufgaben.
Was diese Aufgaben sein können, ist überraschend vielfältig. Der beste Weg herauszufinden, welches Ihrer Probleme am besten mit awk gelöst werden kann, ist awk zu lernen; Sie werden überrascht sein, wie awk Ihnen dabei helfen kann, mit viel weniger Aufwand mehr zu erledigen.
Die grundlegende Syntax von Awk lautet:
awk [options] 'pattern {action}' file
Erstellen Sie zunächst diese Beispieldatei und speichern Sie sie als colours.txt
name farbe menge
apfel rot 4
banane gelb 6
erdbeerrot 3
traube lila 10
apfel grün 8
pflaume lila 2
Kiwi braun 4
Kartoffel braun 9
Ananas gelb 5
Diese Daten werden durch ein oder mehrere Leerzeichen in Spalten getrennt. Es ist üblich, dass Daten, die Sie analysieren, auf irgendeine Weise organisiert sind. Es müssen nicht immer Spalten sein, die durch Leerzeichen oder sogar ein Komma oder Semikolon getrennt sind, aber insbesondere in Protokolldateien oder Datendumps gibt es im Allgemeinen ein vorhersehbares Muster. Sie können Datenmuster verwenden, um awk dabei zu helfen, die Daten zu extrahieren und zu verarbeiten, auf die Sie sich konzentrieren möchten.
Drucken einer Spalte
In awk der Aufdruck Die Funktion zeigt an, was Sie angeben. Es gibt viele vordefinierte Variablen, die Sie verwenden können, aber einige der gebräuchlichsten sind ganze Zahlen, die Spalten in einer Textdatei bezeichnen. Probieren Sie es aus:
$ awk '{print $2;}' colors.txt
Farbe
rot
gelb
rot
lila
grün
lila
braun
braun
gelb
In diesem Fall zeigt awk die zweite Spalte an, gekennzeichnet durch $2 . Dies ist relativ intuitiv, sodass Sie wahrscheinlich erraten können, dass $1 gedruckt wird zeigt die erste Spalte an und gibt $3 aus zeigt die dritte an usw.
Um alle anzuzeigen Spalten, verwenden Sie $0 .
Die Zahl nach dem Dollarzeichen ($ ) ist ein Ausdruck , also $2 und $(1+1) dasselbe bedeuten.
Bedingtes Auswählen von Spalten
Die von Ihnen verwendete Beispieldatei ist sehr strukturiert. Es hat eine Zeile, die als Überschrift dient, und die Spalten beziehen sich direkt aufeinander. Durch die Definition von conditional Anforderungen können Sie qualifizieren, was awk zurückgeben soll, wenn Sie sich diese Daten ansehen. Um beispielsweise Elemente in Spalte 2 anzuzeigen, die mit "gelb" übereinstimmen, und den Inhalt von Spalte 1 auszugeben:
awk '$2=="yellow"{print $1}' colors.txt
Banane
Ananas
Reguläre Ausdrücke funktionieren auch. Diese Bedingung betrachtet $2 für ungefähre Übereinstimmungen mit dem Buchstaben p gefolgt von beliebig vielen (einem oder mehreren) Zeichen, denen wiederum der Buchstabe p folgt :
$ awk '$2 ~ /p.+p/ {print $0}' colors.txt
traube lila 10
pflaume lila 2
Zahlen werden von awk natürlich interpretiert. Zum Beispiel, um eine Zeile mit einer dritten Spalte zu drucken, die eine ganze Zahl größer als 5 enthält:
awk '$3>5 {print $1, $2}' colors.txt
Name Farbe
Banane Gelb
Traube Lila
Apfel Grün
Kartoffel BraunFeldtrenner
Standardmäßig verwendet awk Leerzeichen als Feldtrenner. Nicht alle Textdateien verwenden jedoch Leerzeichen, um Felder zu definieren. Erstellen Sie beispielsweise eine Datei mit dem Namen colours.csv mit diesem Inhalt:
Name,Farbe,Menge
Apfel,rot,4
Banane,gelb,6
Erdbeere,rot,3
Traube,lila,10
Apfel, Grün,8
Pflaume,Lila,2
Kiwi,Braun,4
Kartoffel,Braun,9
Ananas,Gelb,5Awk kann die Daten genauso behandeln, solange Sie angeben, welches Zeichen es als Feldtrenner in Ihrem Befehl verwenden soll. Verwenden Sie den --field-separator (oder einfach -F kurz) Option zum Definieren des Trennzeichens:
$ awk -F"," '$2=="yellow" {print $1}' file1.csv
Banane
AnanasAusgabe speichern
Mithilfe der Ausgabeumleitung können Sie Ihre Ergebnisse in eine Datei schreiben. Zum Beispiel:
$ awk -F, '$3>5 {print $1, $2} colours.csv > output.txt
Dadurch wird eine Datei mit dem Inhalt Ihrer awk-Abfrage erstellt.
Weitere Linux-Ressourcen
- Spickzettel für Linux-Befehle
- Spickzettel für fortgeschrittene Linux-Befehle
- Kostenloser Online-Kurs:RHEL Technical Overview
- Spickzettel für Linux-Netzwerke
- SELinux-Spickzettel
- Spickzettel für allgemeine Linux-Befehle
- Was sind Linux-Container?
- Unsere neuesten Linux-Artikel
Sie können eine Datei auch in mehrere Dateien aufteilen, die nach Spaltendaten gruppiert sind. Wenn Sie beispielsweise colors.txt in mehrere Dateien aufteilen möchten, je nachdem, welche Farbe in jeder Zeile erscheint, können Sie awk veranlassen, pro Abfrage umzuleiten indem Sie die Umleitung in Ihre awk-Anweisung aufnehmen:
$ awk '{print > $2".txt"}' colours.txt
Dadurch werden Dateien mit dem Namen yellow.txt erstellt , red.txt , und so weiter.
Im nächsten Artikel erfahren Sie mehr über Felder, Datensätze und einige mächtige awk-Variablen.
Dieser Artikel ist eine Adaption einer Folge von Hacker Public Radio, einem Community-Technologie-Podcast.