Der AWK-Befehl ist ein leistungsstarkes und vielseitiges Tool zum Verarbeiten und Transformieren von Textdaten unter Linux. Ob Sie Informationen extrahieren, Zeilen filtern, die Ausgabe neu formatieren oder Berechnungen durchführen – AWK kann Ihnen das Leben mit nur wenigen Codezeilen erleichtern. In diesem Artikel erfahren Sie, wie Sie den AWK-Befehl zur Textmanipulation unter Linux verwenden.
Was ist der AWK-Befehl?
Der AWK-Befehl ist eine interpretierte Programmiersprache, die im Linux-Terminal ausgeführt wird. Sein Name leitet sich von den Initialen seiner Schöpfer ab: Alfred Aho, Peter Weinberger und Brian Kernighan. AWK wurde ursprünglich für die Verarbeitung von Dateien entwickelt, die in durch Trennzeichen getrennte Felder strukturiert sind, beispielsweise CSV-Dateien oder /etc/passwd-Dateien. Aber auch komplexere Textdateien wie HTML- oder XML-Dateien kann AWK verarbeiten. AWK ist keine objektorientierte Programmiersprache , ermöglicht jedoch die Definition lokaler oder globaler Funktionen und Variablen. Es verfügt auch über Kontrollstrukturen wie Schleifen und Bedingungen.
Die allgemeine Syntax des AWK-Befehls lautet wie folgt:
awk [Optionen] 'Programm' [Dateien]
Das Programm
besteht aus einer Reihe von Anweisungen, die Muster definieren, nach denen in jeder Zeile der Datei
, sowie Aktionen, die ausgeführt werden sollen, wenn ein Muster gefunden wird. den Optionen
können Sie das Verhalten des AWK-Befehls ändern, beispielsweise die Wahl des Feldtrennzeichens oder das Ausgabeformat.
Wie drucke ich Text mit dem AWK-Befehl?
Mit dem AWK-Befehl kann eine Nachricht basierend auf einem Muster im Text an das Terminal ausgegeben werden. Wenn Sie den AWK-Befehl ohne Angabe von Gründen und nur mit einem Druckbefehl ausführen, druckt AWK die Nachricht jedes Mal, wenn Sie die Eingabetaste drücken.
Wenn Sie beispielsweise Folgendes eingeben:
awk '{print "Hallo"}'
Und wenn Sie mehrmals die Eingabetaste drücken, erhalten Sie:
Guten Morgen, guten Morgen, guten Morgen
Um den AWK-Befehl zu stoppen, können Sie Strg+C drücken.
Wenn Sie den Inhalt einer Datei mit dem AWK-Befehl drucken möchten, können Sie das BEGIN
, das vor dem Lesen der Datei ausgeführt wird, und das END
, das nach dem Lesen der Datei ausgeführt wird. Wenn Sie beispielsweise eine Datei namens test.txt
, die Folgendes enthält:
Dies ist ein Test. AWK ist ein großartiges Tool. Linux ist das beste Betriebssystem
Sie können den Inhalt der Datei mit dem folgenden Befehl drucken:
awk 'BEGIN {print "Hier ist der Inhalt der test.txt-Datei:"} {print} END {print "Ende der Datei"}' test.txt
Welche geben:
Hier ist der Inhalt der test.txt-Datei: Dies ist ein Test. AWK ist ein großartiges Tool. Linux ist das beste Betriebssystem. Ende der Datei
Befehl {print}
ohne Argumente druckt die gesamte Zeile. Sie können ein bestimmtes Feld auch mit der $n
, wobei n
die Feldnummer ist. Standardmäßig werden Felder durch Leerzeichen oder Tabulatoren getrennt, Sie können das Trennzeichen jedoch mit der -F
.
Wenn Sie beispielsweise das erste und dritte Feld der /etc/passwd
, die durch einen Doppelpunkt ( :)
, können Sie den folgenden Befehl verwenden:
awk -F: '{print $1 " " $3}' /etc/passwd
Was etwa Folgendes ergibt:
root 0 daemon 1 bin 2 sys 3 sync 4 games 5 man 6 lp 7 mail 8 news 9 uucp 10 Proxy 13 www-data 33 ...
Mit dem AWK-Befehl können Sie auch arithmetische Ausdrücke oder Zeichenfolgen drucken. Wenn Sie beispielsweise das Quadrat des zweiten Felds der test.txt
, können Sie den folgenden Befehl verwenden:
awk '{print $2^2}' test.txt
Welche geben:
ist 16 ist
test.txt
ausdrucken möchten , können Sie die spezielle Variable NR
, die die Nummer der aktuellen Zeile enthält. Sie können beispielsweise den folgenden Befehl verwenden:
awk 'END {print NR}' test.txt
Welche geben:
3
Wie filtere ich Text mit dem AWK-Befehl?
Mit dem AWK-Befehl kann Text nach Mustern oder Bedingungen gefiltert werden. Wenn Sie vor einer Aktion ein Muster angeben, führt AWK die Aktion nur aus, wenn das Muster in der Zeile gefunden wird. Das Muster kann ein regulärer Ausdruck, ein Vergleich, eine logische Operation oder eine Kombination davon sein.
Wenn Sie beispielsweise Zeilen aus der test.txt
, die das Wort Linux
, können Sie den folgenden Befehl verwenden:
awk '/Linux/ {print}' test.txt
Welche geben:
Linux ist das beste Betriebssystem
/etc/passwd
drucken möchten, deren UID größer als 1000 ist, können Sie den folgenden Befehl verwenden:
awk -F: '$3 > 1000 {print}' /etc/passwd
Was etwa Folgendes ergibt:
systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:TPM software stack,,,:/var/lib/tpm:/bin/false _rpc: x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139: Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...
Sie können auch die logischen Operatoren &&
(und), ||
(oder) und !
(nein) um Muster zu kombinieren. Wenn Sie beispielsweise Zeilen aus der /etc/passwd
, die eine UID größer als 1000 und eine andere Shell als /usr/sbin/nologin
, können Sie den folgenden Befehl verwenden:
awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd
Kopieren
Was etwa Folgendes ergibt:
tss:x:131:142:TPM-Software-Stack,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x: 133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq :x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...
Wie bearbeite ich Text mit dem AWK-Befehl?
Mit dem AWK-Befehl kann Text mithilfe integrierter Funktionen oder spezieller Variablen geändert werden. Wenn Sie beispielsweise in der test.txt
, können Sie die gsub
, die alle Vorkommen einer Zeichenfolge durch eine andere ersetzt. Sie können auch die spezielle OFS-
, die das Ausgabefeldtrennzeichen definiert. Sie können beispielsweise den folgenden Befehl verwenden:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Welche geben:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Weitere verfügbare Funktionen und Variablen finden Sie im AWK-Befehlshandbuch.
Wie verwende ich eine for-Schleife mit dem AWK-Befehl?
Mit dem AWK-Befehl können for-Schleifen über Felder oder Zeilen in einer Datei ausgeführt werden. Die Syntax der for-Schleife lautet wie folgt:
für (Variable im Array) Aktion
Dabei Variable
der Name der Variablen, die nacheinander die Werte aus dem Array
, und Aktion
ist die Aktion, die in jeder Iteration ausgeführt werden soll.
Wenn Sie beispielsweise die Felder einer Datei in umgekehrter Reihenfolge drucken möchten, können Sie die for-Schleife mit der speziellen Variablen NF
, die die Anzahl der Felder in der aktuellen Zeile enthält. Wenn Sie beispielsweise über eine test.txt-
, die Folgendes enthält:
Dies ist ein Test. AWK ist ein großartiges Tool. Linux ist das beste Betriebssystem
Sie können die Reihenfolge der Felder mit dem folgenden Befehl umkehren:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Welche geben:
Testen Sie eines: Dieses großartige Tool. Das eine ist das AWK-Betriebssystem, das beste ist Linux
FNR-
zu durchlaufen , die die Zeilennummer der aktuellen Datei enthält. Wenn Sie beispielsweise die geraden Zeilennummern der test.txt
, können Sie den folgenden Befehl verwenden:
awk 'FNR%2==0 {print FNR}' test.txt
Welche geben:
2
4
Wie führe ich ein AWK-Skript aus?
Erweiterung .awk
chmod +x
Ausführungsrechte erteilen . ./script_name.awk [files]
ausführen .
Wenn Sie beispielsweise ein Skript namens hello.awk
, das Folgendes enthält:
#!/usr/bin/awk -f BEGIN {print „Hallo“}
Sie können das Skript mit dem folgenden Befehl ausführen:
./hello.awk
Welche geben:
Guten Morgen
Wie übergebe ich Argumente an ein AWK-Skript?
Um Argumente an ein AWK-Skript zu übergeben, können Sie zwei Methoden verwenden:
- Die erste Methode besteht darin, die
-v
mit demVariable=Wert
. Wenn Sie beispielsweise zwei Argumente namensvar1
undvar2
an Ihrhello.awk-
, können Sie den folgenden Befehl verwenden:
awk -v var1=hello -v var2=world -f hallo.awk
Und in Ihrem hello.awk-
$var1
und $var2
auf die Argumente zugreifen . Wenn Ihr Skript beispielsweise Folgendes enthält:
#!/usr/bin/awk -f BEGIN {print $var1 " " $var2}
Sie erhalten:
Bonjour Monde
- Die zweite Methode besteht darin, das spezielle
ARGV-
, das die an das Skript übergebenen Argumente enthält. Wenn Sie beispielsweise zwei unbenannte Argumente an Ihrhello.awk
, können Sie den folgenden Befehl verwenden:
awk -f hello.awk hallo Welt
Und in Ihrem hello.awk-
den Indizes ARGV[1]
und ARGV[2]
. Wenn Ihr Skript beispielsweise Folgendes enthält:
#!/usr/bin/awk -f BEGIN {print ARGV[1] " " ARGV[2]}
Sie erhalten:
Bonjour Monde
FAQs
Was ist der Unterschied zwischen AWK und GAWK?
GAWK ist eine GNU-Implementierung von AWK, die der Originalsprache zusätzliche Funktionen hinzufügt, wie etwa die Unterstützung erweiterter regulärer Ausdrücke, mehrdimensionaler Arrays oder vordefinierter Funktionen.
Wie debugge ich ein AWK-Skript?
-W
Parameter lint
verwenden , der Warnmeldungen zu möglichen Fehlern im Skript anzeigt. -W
mit dem dump-variables
verwenden , der die Variablenwerte am Ende der Skriptausführung anzeigt.
Wie verwende ich den AWK-Befehl zum Sortieren von Daten?
Um den AWK-Befehl zum Sortieren von Daten zu verwenden, können Sie den Sortierbefehl
in Kombination mit AWK verwenden. Wenn Sie beispielsweise Benutzer in der /etc/passwd
nach ihren UIDs sortieren möchten, können Sie den folgenden Befehl verwenden:
awk -F: '{print $1, $3}' /etc/passwd | sortieren -n -k2
Durch die Kombination von AWK mit anderen Befehlen (hier sort
) können Sie bei der Anzeige und Organisation von Daten ganz einfach viel weiter gehen.
Wie drucke ich die Wortanzahl einer Datei mit dem AWK-Befehl aus?
Um die Anzahl der Wörter in einer Datei mit dem AWK-Befehl auszugeben, können Sie die spezielle Variable NF
, die die Anzahl der Felder in der aktuellen Zeile enthält, und die spezielle Variable NR
, die die Nummer der aktuellen Zeile enthält. Mit einer for-Schleife können Sie die Anzahl der Wörter in jeder Zeile zählen und sie zu einer Gesamtvariablen
. Mit dem Sondermuster END
können Sie das Endergebnis ausdrucken. Wenn Sie beispielsweise eine Datei namens test.txt
, die Folgendes enthält:
Dies ist ein Test. AWK ist ein großartiges Tool. Linux ist das beste Betriebssystem
Sie können die Wortanzahl der Datei mit dem folgenden Befehl ausdrucken:
awk '{for (i=1; i<=NF; i++) total++} END {print total}' test.txt
Welche geben:
9
Wie verwende ich den AWK-Befehl, um Daten aus einer CSV-Datei zu extrahieren?
Um den AWK-Befehl zum Extrahieren von Daten aus einer CSV-Datei (Comma-Separated Values) zu verwenden, können Sie die -F
, um das Feldtrennzeichen auf ein Komma festzulegen. Wenn Sie beispielsweise eine Datei mit dem Namen test.csv
, die Folgendes enthält:
Name, Vorname, Alter Alice, Dupont, 25 Bob, Martin, 32 Charles, Durand, 28
Mit dem folgenden Befehl können Sie den Namen und das Alter von Personen extrahieren:
awk -F"," '{print $1 " " $3}' test.csv
Welche geben:
Name Alter Alice 25 Bob 32 Charles 28
Wie filtere ich Daten mit dem AWK-Befehl?
Mit dem AWK-Befehl können Sie Daten basierend auf Mustern filtern, bei denen es sich um reguläre Ausdrücke oder logische Bedingungen handelt. Muster werden vor Aktionen platziert, getrennt durch geschweifte Klammern. Wenn Sie beispielsweise Zeilen in der test.csv
Alice
enthalten , können Sie das folgende Muster verwenden:
awk -F"," '/Alice/ {print}' test.csv
Welche geben:
Alice,Dupont,25
test.csv-
anzeigen möchten , die älter als 30 Jahre sind, können Sie das folgende Muster verwenden:
awk -F"," '$3 > 30 {print}' test.csv
Welche geben:
Bob,Martin,32
Sie können mehrere Muster mit den logischen Operatoren &&
(und), ||
(oder) und !
(NEIN). Wenn Sie beispielsweise Zeilen in der test.csv
, deren Name mit C
oder deren Alter weniger als 10 Jahre beträgt, können Sie das folgende Muster verwenden:
awk -F"," '($1 ~ /^C/) || ($3 < 10) {print}' test.csv
Welche geben:
CAMILLE,M,7 CLARA,F,11 CLEMENT,M,7
Wie berechnet man Statistiken mit dem AWK-Befehl?
Mit dem AWK-Befehl können Sie Statistiken zu numerischen Daten in einer Datei berechnen, z. B. Summe, Durchschnitt, Minimum oder Maximum. Verwenden Sie dazu einfach Variablen, um Zwischenwerte zu speichern und diese in jeder Zeile zu aktualisieren. Mit dem speziellen END-
können wir das Endergebnis anzeigen. Wenn Sie beispielsweise die Summe und den Durchschnitt der Altersangaben in der test.csv
, können Sie das folgende Programm verwenden:
awk -F"," 'NR>1 {sum+=$3; count++} END {print "Summe: " sum; print 'Durchschnitt: 'Summe/Anzahl}' test.csv
Welche geben:
Summe: 110 Durchschnitt: 18,3333
Erläuterungen:
- Wir verwenden die
-F“,
um das Feldtrennzeichen als Komma zu definieren. - Wir verwenden die Bedingung
NR>1
, um die erste Zeile der Datei zu ignorieren, die die Spaltennamen enthält. - Wir verwenden die
sum
undcount,
um die Summe und Anzahl der Altersgruppen zu akkumulieren. Operator+=
, um die Variablen mit dem Wert des dritten Felds ($3
) zu erhöhen. - Wir verwenden das
END-
, um das Endergebnis anzuzeigen. Wir verwenden den/
, um den Durchschnitt zu berechnen, indem wir die Summe durch die Zahl dividieren.
Wenn Sie das Mindest- und Höchstalter der test.csv
, können Sie ebenfalls das folgende Programm verwenden:
awk -F"," 'NR>1 {if (min=="") min=max=$3; wenn ($3 max) max=$3} END {print "Min: " min; print 'Max: 'max}' test.csv
Welche geben:
Min: 6 Max: 32
Erläuterungen:
- Wir verwenden die
-F“,
um das Feldtrennzeichen als Komma zu definieren. - Wir verwenden die Bedingung
NR>1
, um die erste Zeile der Datei zu ignorieren, die die Spaltennamen enthält. - Wir verwenden die
„min“
und„max“
, um das Mindest- und Höchstalter zu speichern. Wir initialisieren diese Variablen mit dem Wert des dritten Feldes ($3
), wenn sie leer sind (""
). Wir verwenden die<
und>
, um Werte zu vergleichen und Variablen bei Bedarf zu aktualisieren. - Wir verwenden das
END-
, um das Endergebnis anzuzeigen.
Abschluss
Der AWK-Befehl ist ein unverzichtbares Werkzeug zum Bearbeiten von Texten unter Linux. Damit können Sie komplexe Aufgaben in wenigen Codezeilen ausführen, z. B. das Extrahieren, Filtern, Ändern oder Berechnen von Daten. Dank seiner Muster, Aktionen, Funktionen und Variablen bietet es große Flexibilität. Es kann mit anderen Linux-Befehlen kombiniert werden, um seine Möglichkeiten zu erweitern. Sie können beispielsweise den Echo-Befehl unter Windows , um eine Nachricht oder Variable auf dem Bildschirm anzuzeigen. Wenn Sie mehr über den AWK-Befehl erfahren möchten, können Sie das Handbuch oder die zahlreichen Tutorials im Internet konsultieren.