AWK-Befehl unter Linux und Unix: Syntax, Beispiele und Anwendungsfälle
Der AWK-Befehl ist ein Werkzeug zur Textverarbeitung, das auf Linux- und Unix-Systemen verfügbar ist. AWK verarbeitet Eingaben zeilenweise, zerlegt jede Zeile in einzelne Felder und wendet von dir festgelegte Muster-Aktions-Regeln an, um Daten zu filtern, zu verändern oder auszuwerten. Der Name AWK geht auf seine Entwickler Alfred Aho, Peter Weinberger und Brian Kernighan zurück. Das Werkzeug gehört bereits seit 1977 zu Unix und ist bis heute ein bewährter Bestandteil für die Administration von Linux-Systemen.
AWK ist besonders praktisch, wenn du bestimmte Spalten aus strukturierten Texten auslesen, Logdateien analysieren, CSV-Daten verarbeiten oder direkt innerhalb einer Shell-Pipeline schnelle Auswertungen erzeugen möchtest, ohne dafür ein vollständiges Skript schreiben zu müssen.
In diesem Tutorial lernst du die Syntax von AWK kennen, arbeitest mit praktischen Beispielen zu Mustererkennung, Feldtrennern und integrierten Variablen und erfährst außerdem, wie sich AWK von anderen Werkzeugen zur Textverarbeitung wie grep und sed unterscheidet.
Wichtige Erkenntnisse:
- AWK verarbeitet Text Zeile für Zeile und zerlegt jede Zeile anhand eines Feldtrenners in Felder wie
$1,$2, … und$NF. - Die grundlegende Syntax lautet
awk 'pattern { action }' filename. Wird kein Muster angegeben, führt AWK die Aktion für jede Eingabezeile aus. - Mit der Option
-Flegst du den Feldtrenner fest, beispielsweise-F,für CSV-Dateien oder-F:für Dateien mit Doppelpunkten als Trennzeichen. - Zu den wichtigsten integrierten Variablen zählen
NRfür die aktuelle Zeilennummer,NFfür die Anzahl der Felder in der aktuellen Zeile,FSfür den Eingabe-Feldtrenner,OFSfür den Ausgabe-Feldtrenner,RSfür den Eingabe-Datensatztrenner undORSfür den Ausgabe-Datensatztrenner. - Der
BEGIN-Block wird ausgeführt, bevor AWK Eingabezeilen verarbeitet, und eignet sich unter anderem zum Initialisieren von Variablen oder Ausgeben von Überschriften. - Der
END-Block wird ausgeführt, nachdem sämtliche Eingaben verarbeitet wurden. Er eignet sich daher für Zusammenfassungen, Summen und abschließende Berechnungen. - AWK eignet sich hervorragend zum Auslesen einzelner Spalten, für Berechnungen mit Feldwerten sowie zum Umwandeln und Zusammenfassen strukturierter Daten wie Logdateien oder CSV-Dateien.
- Für einfache Suchvorgänge eignet sich
grep, für direkte Textänderungensed. Sobald Felder, Spaltenberechnungen oder individuell formatierte Ausgaben erforderlich sind, ist AWK häufig die geeignetere Lösung.
Linux-Workloads lassen sich auf skalierbarer und zuverlässiger Cloud-Computing-Infrastruktur betreiben, die für Entwickler ausgelegt ist.
Voraussetzungen
Um diesem Tutorial folgen zu können, benötigst du:
- Ein Linux- oder Unix-System, auf dem AWK installiert ist. Die meisten Distributionen enthalten GNU AWK (
gawk) bereits standardmäßig. Mitawk --versionkannst du die Installation überprüfen. - Grundlegende Kenntnisse im Umgang mit der Linux-Kommandozeile.
Was ist der AWK-Befehl unter Linux und Unix?
AWK ist sowohl ein Werkzeug zur Mustersuche als auch eine Sprache zur Textverarbeitung. Du definierst Regeln nach dem Schema pattern { action }, die AWK anschließend auf jede eingelesene Zeile anwendet. Entspricht eine Zeile dem angegebenen Muster, wird die zugehörige Aktion ausgeführt. Wird kein Muster festgelegt, gilt die Aktion für jede Zeile.
GNU AWK (gawk) ist heute eine der am häufigsten eingesetzten Implementierungen von AWK und dient auf vielen Linux-Distributionen als standardmäßiges awk. Es erweitert den ursprünglichen POSIX-AWK-Standard beispielsweise um eine verbesserte Unicode-Unterstützung sowie zusätzliche String-Funktionen. Welche Version auf deinem System installiert ist, kannst du folgendermaßen überprüfen:
awk –version
Auf einem typischen Linux-System kann die Ausgabe beispielsweise so aussehen:
GNU Awk 5.2.1, API 3.2, PMA Avon 8-g1, (GNU MPFR 4.2.1, GNU MP 6.3.0)
Wie sich AWK von grep und sed unterscheidet
Alle drei Werkzeuge verarbeiten Text, haben jedoch unterschiedliche Schwerpunkte. grep sucht nach Zeilen, die einem bestimmten Muster entsprechen, und gibt diese aus. sed führt Ersetzungen und andere Bearbeitungen innerhalb eines Textstroms durch. AWK kann vergleichbare Aufgaben übernehmen, bietet darüber hinaus jedoch ein Verständnis für einzelne Felder, ermöglicht Berechnungen und kann formatierte Berichte erzeugen.
Ein schneller Vergleich:
| Werkzeug | Besonders geeignet für | Feldorientiert | Berechnungen | Mehrzeilige Logik |
|---|---|---|---|---|
grep |
Zeilen finden, die einem Muster entsprechen | Nein | Nein | Nein |
sed |
Suchen und Ersetzen sowie Bearbeiten von Zeilen | Nein | Nein | Eingeschränkt |
awk |
Spalten auslesen, Berechnungen durchführen und Berichte erstellen | Ja | Ja | Ja |
Weitere Einzelheiten zu den jeweiligen Werkzeugen findest du in Tutorials zum grep-Befehl und zum sed-Befehl.
AWK-Syntax und grundlegender Aufbau
Beim Verarbeiten strukturierter Textdateien unter Unix oder Linux müssen häufig dieselben Schritte zum Zerlegen und Auswerten von Daten wiederholt werden. AWK vereinfacht diesen Vorgang: Du definierst lediglich die benötigten Muster und Aktionen, während das Werkzeug die eigentliche Verarbeitung übernimmt.
Aufbau des AWK-Befehls
Die grundlegende AWK-Syntax lautet:
awk options ‚pattern { action }‘ input-file
Du kannst die erzeugte Ausgabe außerdem in eine Datei umleiten:
awk options ‚pattern { action }‘ input-file > output-file
Zu den häufig verwendeten Optionen gehören:
-Flegt den Feldtrenner fest, beispielsweise-F:für durch Doppelpunkte getrennte Daten.-fliest die AWK-Anweisungen aus einer Skriptdatei ein, anstatt sie direkt über die Kommandozeile anzugeben.-vweist einer Variablen einen Wert zu, bevor die Verarbeitung beginnt.
Muster und Aktionsblöcke erklärt
Eine AWK-Regel besteht aus zwei Bestandteilen: einem Muster und einer in geschweiften Klammern definierten Aktion. Beide Bestandteile können auch weggelassen werden:
- Wird das Muster ausgelassen, führt AWK die Aktion für jede Eingabezeile aus.
- Wird der Aktionsblock weggelassen, gibt AWK standardmäßig jede Zeile aus, die dem Muster entspricht.
# Jede Zeile ausgeben (kein Muster, print ist die Standardaktion)
awk ‚{ print }‘ file.txt
# Nur Zeilen ausgeben, die dem Muster entsprechen (keine explizite Aktion erforderlich)
awk ‚/error/‘ file.txt
So führst du den AWK-Befehl unter Linux aus
AWK eignet sich besonders für strukturierte Texte, wenn du Spalten schnell auswählen, verändern oder zusammenfassen möchtest. Bevor du komplexere Funktionen verwendest, solltest du zunächst die grundlegenden Möglichkeiten zum Ausführen von AWK-Befehlen unter Linux kennen.
Eine Beispieldatei erstellen
Für die Beispiele in diesem Tutorial wird eine Datei mit dem Namen file.txt verwendet. Erstelle diese Datei, damit du die folgenden Beispiele nachvollziehen kannst:
cat > file.txt << ‚EOF‘
Item Model Country Cost
Phone iPhone USA 999
Laptop MacBook USA 1299
Watch Galaxy Korea 299
Tablet iPad USA 499
Camera Sony Japan 799
EOF
Die Datei enthält vier Spalten: Item, Model, Country und Cost.
AWK auf einer Datei ausführen
Gib den Namen der zu verarbeitenden Datei als letztes Argument des Befehls an:
awk ‚{ print $0 }‘ file.txt
$0 steht für die gesamte aktuelle Eingabezeile. Das Ergebnis lautet:
Item Model Country Cost
Phone iPhone USA 999
Laptop MacBook USA 1299
Watch Galaxy Korea 299
Tablet iPad USA 499
Camera Sony Japan 799
AWK mit Kommandozeilen-Eingaben ausführen
Anstatt Daten aus einer Datei einzulesen, kannst du die Ausgabe eines anderen Befehls über eine Pipe direkt an AWK weitergeben:
echo „Alice Engineering 95000“ | awk ‚{ print $1, „arbeitet in“, $2 }‘
Die Ausgabe lautet:
Alice arbeitet in Engineering
AWK aus einer Skriptdatei ausführen
Bei längeren AWK-Programmen oder Regeln, die du mehrfach verwenden möchtest, kannst du die Anweisungen in einer separaten Datei speichern und sie anschließend mit der Option -f laden:
# Regeln in einer Skriptdatei speichern
echo ‚{ print $1, $4 }‘ > print_item_cost.awk
# Skript ausführen
awk -f print_item_cost.awk file.txt
Die Ausgabe lautet:
Item Cost
Phone 999
Laptop 1299
Watch 299
Tablet 499
Camera 799
AWK-Feldtrenner und Spaltenoperationen
AWK zerlegt jede Eingabezeile anhand eines Trennzeichens in einzelne Felder. Standardmäßig dient beliebiger Leerraum als Trennzeichen, also beispielsweise Leerzeichen oder Tabulatoren.
Den standardmäßigen Feldtrenner verwenden
Die Nummerierung der Felder beginnt bei $1. $0 steht dagegen immer für die vollständige Zeile.
Um beispielsweise die zweite und dritte Spalte auszugeben, verwendest du:
awk ‚{ print $2 „\t“ $3 }‘ file.txt
Das Ergebnis ist:
Model Country
iPhone USA
MacBook USA
Galaxy Korea
iPad USA
Sony Japan
Einen benutzerdefinierten Feldtrenner mit -F festlegen
Die Option -F kommt zum Einsatz, wenn deine Daten mit einem anderen Zeichen als Leerraum getrennt werden. Das ist beispielsweise bei CSV-Daten oder bei Systemdateien wie /etc/passwd der Fall, deren Felder durch Doppelpunkte voneinander getrennt sind.
# Das erste Feld (Benutzername) aus /etc/passwd ausgeben
awk -F: ‚{ print $1 }‘ /etc/passwd | head -5
Die Ausgabe ist:
root
daemon
bin
sys
sync
Bestimmte Spalten mit $1, $2 und $NF ausgeben
$NF ist eine spezielle Referenz auf das letzte Feld des aktuellen Datensatzes. Dabei spielt es keine Rolle, wie viele Felder die jeweilige Zeile tatsächlich enthält.
# Das erste und das letzte Feld ausgeben
awk ‚{ print $1, $NF }‘ file.txt
Die Ausgabe lautet:
Item Cost
Phone 999
Laptop 1299
Watch 299
Tablet 499
Camera 799
AWK: Referenz der integrierten Variablen
AWK stellt mehrere vordefinierte Variablen bereit. Mit ihnen erhältst du Informationen über den aktuell verarbeiteten Datensatz und kannst zugleich steuern, wie Ein- und Ausgaben formatiert werden.
NR, NF, FS, RS, OFS und ORS erklärt
| Variable | Beschreibung |
|---|---|
NR |
Die Nummer des aktuellen Datensatzes beziehungsweise der aktuellen Zeile, beginnend bei 1 |
NF |
Die Anzahl der Felder in der aktuell verarbeiteten Zeile |
FS |
Der Feldtrenner für Eingaben; standardmäßig wird Leerraum verwendet |
RS |
Der Datensatztrenner für Eingaben; standardmäßig ist dies ein Zeilenumbruch |
OFS |
Der Feldtrenner für Ausgaben; standardmäßig wird ein Leerzeichen verwendet |
ORS |
Der Datensatztrenner für Ausgaben; standardmäßig ist dies ein Zeilenumbruch |
Praktische Beispiele mit integrierten Variablen
Mit NR kannst du jede Zeile gemeinsam mit ihrer jeweiligen Zeilennummer ausgeben:
awk ‚{ print NR, $0 }‘ file.txt
Das Ergebnis ist:
1 Item Model Country Cost
2 Phone iPhone USA 999
3 Laptop MacBook USA 1299
4 Watch Galaxy Korea 299
5 Tablet iPad USA 499
6 Camera Sony Japan 799
Mit OFS lässt sich das Trennzeichen für die Ausgabe verändern. Das folgende Beispiel erzeugt kommaseparierte Werte:
awk ‚BEGIN { OFS=“,“ } { print $1, $2, $3 }‘ file.txt
Die Ausgabe lautet:
Item,Model,Country
Phone,iPhone,USA
Laptop,MacBook,USA
Watch,Galaxy,Korea
Tablet,iPad,USA
Camera,Sony,Japan
Mit NF kannst du für jede Zeile anzeigen lassen, wie viele Felder sie enthält:
awk ‚{ print NF, $0 }‘ file.txt
Die Ausgabe ist:
4 Item Model Country Cost
4 Phone iPhone USA 999
4 Laptop MacBook USA 1299
4 Watch Galaxy Korea 299
4 Tablet iPad USA 499
4 Camera Sony Japan 799
AWK Pattern Matching: Beispiele zur Mustersuche
Die folgenden Beispiele zeigen verschiedene Möglichkeiten, Text mithilfe der Mustererkennung von AWK zu finden und anschließend zu verarbeiten.
Zeilen mit einer bestimmten Zeichenfolge finden
Um alle Zeilen auszugeben, in denen der Buchstabe o vorkommt, verwendest du:
awk ‚/o/ { print $0 }‘ file.txt
Das Ergebnis lautet:
Item Model Country Cost
Phone iPhone USA 999
Laptop MacBook USA 1299
Watch Galaxy Korea 299
Camera Sony Japan 799
Wenn du zählen möchtest, wie viele Zeilen einem bestimmten Muster entsprechen, kannst du einen Zähler verwenden und ihn anschließend über einen END-Block ausgeben:
awk ‚/a/ { ++cnt } END { print „Anzahl = „, cnt }‘ file.txt
Die Ausgabe lautet:
Anzahl = 4
Reguläre Ausdrücke in AWK verwenden
AWK unterstützt reguläre Ausdrücke direkt innerhalb der Schreibweise /pattern/. Um beispielsweise Zeilen zu finden, die mit einem Großbuchstaben beginnen, auf den ein Kleinbuchstabe folgt, verwendest du:
awk ‚/^[A-Z][a-z]/ { print $0 }‘ file.txt
Das Ergebnis ist:
Phone iPhone USA 999
Laptop MacBook USA 1299
Watch Galaxy Korea 299
Tablet iPad USA 499
Camera Sony Japan 799
Bestimmte Feldwerte mit AWK abgleichen
Wenn du nicht die vollständige Zeile, sondern gezielt den Inhalt eines einzelnen Feldes prüfen möchtest, kannst du anstelle eines regulären Ausdrucks einen Vergleich verwenden:
# Zeilen ausgeben, bei denen Country (Feld 3) USA entspricht
awk ‚$3 == „USA“ { print $0 }‘ file.txt
Die Ausgabe lautet:
Phone iPhone USA 999
Laptop MacBook USA 1299
Tablet iPad USA 499
Auch numerische Werte lassen sich für Filterbedingungen verwenden:
# Zeilen ausgeben, bei denen Cost (Feld 4) größer als 500 ist
awk ‚$4 > 500 { print $0 }‘ file.txt
Das Ergebnis ist:
Item Model Country Cost
Phone iPhone USA 999
Laptop MacBook USA 1299
Camera Sony Japan 799
Um ausschließlich Zeilen mit mehr als 20 Zeichen auszugeben, kannst du die integrierte Funktion length einsetzen:
awk ‚length($0) > 20‘ file.txt
AWK BEGIN- und END-Blöcke
AWK beschränkt sich nicht auf das reine Verarbeiten einzelner Zeilen. Mit den Blöcken BEGIN und END kannst du vorbereitende Aufgaben durchführen, bevor Eingaben gelesen werden, und abschließende Aktionen ausführen, sobald sämtliche Daten verarbeitet wurden.
Was BEGIN und END bewirken
BEGIN und END sind besondere Muster in AWK:
- Der
BEGIN-Block wird genau einmal ausgeführt, bevor AWK die erste Eingabe liest. Du kannst ihn beispielsweise zum Ausgeben von Überschriften, zum Initialisieren von Variablen oder zum Festlegen von Trennzeichen verwenden. - Der
END-Block wird genau einmal ausgeführt, nachdem AWK sämtliche Eingaben verarbeitet hat. Er eignet sich beispielsweise für Summen, Zusammenfassungen und andere abschließende Ausgaben.
BEGIN zum Festlegen von Variablen vor der Verarbeitung verwenden
awk ‚BEGIN { print „Item\tCost“; print „—-\t—-“ } NR > 1 { print $1 „\t“ $4 }‘ file.txt
Die Ausgabe lautet:
Item Cost
—
Phone 999
Laptop 1299
Watch 299
Tablet 499
Camera 799
END für Zusammenfassungen nach der Verarbeitung verwenden
awk ‚BEGIN { print „AWK-Verarbeitung startet…“ } { print $1 } END { print „Fertig. Verarbeitet wurden “ NR “ Zeilen.“ }‘ file.txt
Die Ausgabe ist:
AWK-Verarbeitung startet…
Item
Phone
Laptop
Watch
Tablet
Camera
Fertig. Verarbeitet wurden 6 Zeilen.
Bedingungen und Kontrollfluss in AWK
Manche Aufgaben bei der Datenverarbeitung erfordern mehr als eine einfache Mustersuche. AWK stellt dafür Kontrollfluss-Funktionen bereit, mit denen du beispielsweise Statistiken berechnen, Datensätze verfolgen, Werte vorbereiten oder Entscheidungen während der Verarbeitung treffen kannst. Blöcke und logische Bedingungen ermöglichen dabei eine flexible und effiziente Verarbeitung.
if- und if-else-Anweisungen in AWK
AWK unterstützt if, if-else sowie verschachtelte Bedingungen innerhalb von Aktionsblöcken.
# Artikel abhängig vom Preis als teuer oder günstig kennzeichnen
awk ‚NR > 1 { if ($4 > 500) print $1, „ist teuer“; else print $1, „ist günstig“ }‘ file.txt
Die Ausgabe ist:
Phone ist teuer
Laptop ist teuer
Watch ist günstig
Tablet ist günstig
Camera ist teuer
Mehrere Bedingungen kannst du mit && für UND oder || für ODER miteinander verbinden:
# Artikel aus den USA ausgeben, deren Preis über 500 liegt
awk ‚$3 == „USA“ && $4 > 500 { print $0 }‘ file.txt
Das Ergebnis lautet:
Phone iPhone USA 999
Laptop MacBook USA 1299
Schleifen in AWK: for und while
AWK unterstützt sowohl for– als auch while-Schleifen. Sie sind beispielsweise dann hilfreich, wenn du sämtliche Felder einer Zeile nacheinander durchlaufen möchtest:
# Jedes Feld zusammen mit seiner Feldnummer in einer eigenen Zeile ausgeben
awk ‚NR == 2 { for (i = 1; i <= NF; i++) print „Feld “ i „: “ $i }‘ file.txt
Die Ausgabe lautet:
Feld 1: Phone
Feld 2: iPhone
Feld 3: USA
Feld 4: 999
Eine while-Schleife funktioniert nach einem ähnlichen Prinzip:
awk ‚BEGIN { i = 1; while (i <= 5) { print „Zeile:“, i; i++ } }‘
Das Ergebnis ist:
Zeile: 1
Zeile: 2
Zeile: 3
Zeile: 4
Zeile: 5
Praktische AWK-Anwendungsfälle mit Beispielen
Die folgenden praktischen Beispiele zeigen, wie du AWK direkt im Terminal für typische Aufgaben der Datenverarbeitung einsetzen kannst.
/etc/passwd mit AWK auswerten
Die Datei /etc/passwd speichert pro Zeile einen Benutzerdatensatz und verwendet Doppelpunkte als Feldtrenner. Mit AWK und der Option -F: lassen sich einzelne Werte bequem auslesen.
# Benutzername und Standard-Shell jedes Benutzers ausgeben
awk -F: ‚{ print $1, $7 }‘ /etc/passwd | head -5
Auf einem typischen Linux-System kann die Ausgabe beispielsweise so aussehen:
root /bin/bash
daemon /usr/sbin/nologin
bin /usr/sbin/nologin
sys /usr/sbin/nologin
sync /bin/sync
Um ausschließlich Benutzer anzuzeigen, deren konfigurierte Shell /bin/bash ist, verwendest du:
awk -F: ‚$7 == „/bin/bash“ { print $1 }‘ /etc/passwd
CSV-Dateien mit AWK verarbeiten
Erstelle zunächst die folgende Beispiel-CSV-Datei:
cat > employees.csv << ‚EOF‘
Name,Department,Salary
Alice,Engineering,95000
Bob,Marketing,72000
Charlie,Engineering,88000
Diana,HR,65000
Eve,Marketing,78000
EOF
Gib anschließend den Namen und die Abteilung jedes Mitarbeiters aus und überspringe dabei die Kopfzeile:
awk -F, ‚NR > 1 { print $1, „arbeitet in“, $2 }‘ employees.csv
Die Ausgabe lautet:
Alice arbeitet in Engineering
Bob arbeitet in Marketing
Charlie arbeitet in Engineering
Diana arbeitet in HR
Eve arbeitet in Marketing
System-Logdateien mit AWK zusammenfassen
Erstelle für die folgenden Beispiele zunächst eine Beispiel-Logdatei:
cat > access.log << ‚EOF‘
192.168.1.1 GET /index.html 200 1024
192.168.1.2 POST /login 404 512
192.168.1.3 GET /about.html 200 2048
192.168.1.1 GET /contact.html 500 256
192.168.1.4 GET /index.html 200 1024
EOF
Gib alle IP-Adressen aus, bei denen der Statuscode 200 zurückgegeben wurde:
awk ‚$4 == 200 { print $1 }‘ access.log
Die Ausgabe ist:
192.168.1.1
192.168.1.3
192.168.1.4
Um die Anzahl der 404-Fehler zu ermitteln, verwendest du:
awk ‚$4 == 404 { count++ } END { print „404-Fehler:“, count }‘ access.log
Das Ergebnis lautet:
404-Fehler: 1
Spaltensummen mit AWK berechnen
Um alle Werte aus der Spalte Cost in file.txt zu addieren und dabei die erste Zeile zu überspringen, kannst du folgenden Befehl verwenden:
awk ‚NR > 1 { sum += $4 } END { print „Gesamtkosten:“, sum }‘ file.txt
Die Ausgabe lautet:
Gesamtkosten: 3895
Auch ein Durchschnittswert lässt sich auf diese Weise berechnen:
awk -F, ‚NR > 1 { sum += $3; count++ } END { print „Durchschnittsgehalt:“, sum / count }‘ employees.csv
Das Ergebnis ist:
Durchschnittsgehalt: 79600
AWK-Ausgabe in einer Datei speichern
Wenn du die Ausgabe eines AWK-Befehls dauerhaft speichern möchtest, kannst du sie mit dem Umleitungsoperator > in eine Datei schreiben:
awk ‚/a/ { print $3 „\t“ $4 }‘ file.txt > output.txt
Mit cat kannst du anschließend den Inhalt der Datei überprüfen:
cat output.txt
Die Ausgabe lautet:
USA 1299
Korea 299
USA 499
Japan 799
AWK vs. sed vs. grep: Welches Werkzeug eignet sich wann?
| Anwendungsfall | Geeignetes Werkzeug |
|---|---|
| Zeilen suchen, die ein bestimmtes Muster enthalten | grep |
| Text innerhalb einer Datei suchen und ersetzen | sed |
| Eine bestimmte Spalte aus strukturierten Daten auslesen | awk |
| Berechnungen mit Spaltenwerten durchführen | awk |
| Formatierte Berichte oder Zusammenfassungen erzeugen | awk |
| Einfache Ersetzungen innerhalb eines Skripts durchführen | sed |
| Logzeilen anhand einer festen Zeichenfolge filtern | grep |
| CSV-Dateien oder durch Doppelpunkte getrennte Daten verarbeiten | awk |
Verwende grep, wenn du hauptsächlich überprüfen möchtest, ob ein bestimmtes Muster vorkommt, und die passenden Zeilen ausgeben willst. sed eignet sich, wenn Text ersetzt oder entfernt werden soll. AWK ist dagegen besonders sinnvoll, wenn du mit einzelnen Feldern arbeitest, Vergleiche oder Berechnungen durchführen möchtest oder Ausgaben von den Werten mehrerer Spalten abhängig sind.
Häufig gestellte Fragen zu AWK
1. Was ist der AWK-Befehl unter Unix?
AWK ist ein leistungsfähiges Werkzeug zur Textverarbeitung, das sowohl auf Unix- als auch auf Linux-Systemen verfügbar ist. Es wurde für die Suche nach Mustern und die Erstellung von Auswertungen entwickelt und verarbeitet Dateien oder Datenströme jeweils einen Datensatz beziehungsweise eine Zeile nach der anderen. Jede Eingabezeile wird automatisch anhand eines Trennzeichens in einzelne Felder aufgeteilt. Standardmäßig verwendet AWK dafür Leerraum. Anschließend kannst du eigene Regeln in Form sogenannter Muster-Aktions-Paare verwenden, um Datensätze zu filtern, Spalten auszulesen, Berechnungen durchzuführen, Berichte zu erstellen und weitere Verarbeitungsschritte auszuführen. Da AWK direkt mit einzelnen Spalten arbeiten kann, eignet es sich besonders für strukturierte oder getrennte Daten wie Logdateien, CSV-Dateien und Konfigurationsdateien.
2. Wie führt man den AWK-Befehl unter Linux aus?
AWK wird üblicherweise mit folgender Syntax aufgerufen:
awk ‚pattern { action }‘ filename
Für jede Zeile der angegebenen Datei überprüft AWK das definierte Muster. Entspricht die Zeile dem Muster, wird die zugehörige Aktion ausgeführt. Wenn kein Muster angegeben wird, führt AWK die Aktion für jede Zeile aus. Daten können außerdem über eine Pipeline mit command | awk '{ action }' an AWK weitergegeben werden, wodurch sich das Werkzeug unkompliziert in Shell-Pipelines integrieren lässt. AWK kann mehrere Eingabedateien gleichzeitig verarbeiten. Mit Kommandozeilenoptionen wie -F kannst du Feldtrenner definieren, während -f dazu dient, umfangreichere AWK-Programme aus einer externen Datei einzulesen. Dadurch eignet sich AWK für zahlreiche Aufgaben in der Automatisierung und Textverarbeitung.
3. Was macht awk '{ print $1 }'?
Der Befehl awk '{ print $1 }' gibt aus jeder Eingabezeile das erste Feld beziehungsweise die erste Spalte aus. Standardmäßig trennt AWK die einzelnen Felder anhand von Leerraum. $1 steht deshalb für das erste Wort beziehungsweise den ersten Wert einer Zeile.
Enthält eine Zeile beispielsweise die Werte Name Age Country, gibt dieser Befehl lediglich den Wert Name aus. Das Verfahren wird häufig verwendet, um schnell die erste Spalte aus strukturierten Daten zu extrahieren.
4. Was macht awk '{ print $2 }'?
awk '{ print $2 }' liest aus jeder Eingabezeile das zweite Feld aus und gibt es aus. Wird beispielsweise eine Zeile wie John 30 Engineer verarbeitet, liefert der Befehl den Wert 30, da $2 das zweite Feld bezeichnet. Auf diese Weise lassen sich einzelne Spalten aus tabellarischen oder durch Leerraum getrennten Daten sehr einfach extrahieren.
5. Wofür wird die Option -F in AWK verwendet?
Mit der Option -F bestimmst du den Feldtrenner, anhand dessen AWK eine Zeile in einzelne Felder zerlegt. Standardmäßig nutzt AWK Leerraum, mit -F kannst du jedoch ein anderes Zeichen oder sogar einen regulären Ausdruck als Trennzeichen festlegen. Der Befehl awk -F: '{ print $1 }' /etc/passwd weist AWK beispielsweise an, den Doppelpunkt (:) als Feldtrenner zu verwenden. Das ist bei Dateien wie /etc/passwd hilfreich, deren Felder durch Doppelpunkte voneinander getrennt sind. Dadurch kann AWK flexibel mit vielen unterschiedlichen Formaten strukturierter Daten umgehen.
6. Was sind NR und NF in AWK?
NR und NF gehören zu den wichtigsten integrierten Variablen von AWK. NR steht für Number of Record und enthält die Nummer des aktuell verarbeiteten Datensatzes beziehungsweise der aktuellen Zeile. Der Wert wird mit jeder verarbeiteten Eingabezeile erhöht. Dadurch kannst du beispielsweise Zeilennummern ausgeben oder bestimmte Aktionen nur für ausgewählte Zeilen durchführen.
NF steht für Number of Fields und enthält die Anzahl der Felder beziehungsweise Spalten in der aktuellen Zeile. Die Variable ist besonders nützlich, wenn Zeilen unterschiedlich viele Felder enthalten oder wenn du mit $NF gezielt auf das jeweils letzte Feld zugreifen möchtest. Beide Variablen spielen eine wichtige Rolle beim Filtern, Formatieren und Steuern der AWK-Verarbeitung.
7. Was ist der Unterschied zwischen AWK und gawk?
gawk ist die GNU-Implementierung der AWK-Sprache und wird auf vielen modernen Linux-Distributionen als standardmäßiger AWK-Interpreter verwendet. Während traditionelles AWK dem POSIX-Standard folgt, erweitert gawk die Sprache um zusätzliche Funktionen. Dazu zählen unter anderem eine verbesserte Unterstützung für Unicode und Multibyte-Zeichen, zusätzliche String- und Rechenfunktionen, integrierte Netzwerkfunktionen und erweiterte Kommandozeilenoptionen. Die meisten Programme, die für Standard-AWK geschrieben wurden, funktionieren ebenfalls mit gawk. Die zusätzlichen GNU-Funktionen ermöglichen darüber hinaus komplexere Aufgaben bei der Textverarbeitung.
8. Wann sollte man AWK statt Python oder sed verwenden?
AWK eignet sich besonders für schnelle Einzeiler zur Feldextraktion, zur spaltenbasierten Filterung und zur direkten Verarbeitung von Text. Das gilt insbesondere innerhalb von Shell-Pipelines oder bei strukturierten tabellarischen Daten. Erfordert eine Aufgabe dagegen umfangreichere Programmierlogik, komplexe Datenverarbeitung oder die Integration mit anderen Systemen, kann Python aufgrund seiner großen Bibliotheksauswahl und besseren Wartbarkeit bei größeren Skripten die geeignetere Wahl sein. sed ist dagegen besonders stark bei einfachen Ersetzungen und anderen zeilenweisen Änderungen innerhalb von Textdateien oder Datenströmen. Zusammengefasst eignet sich AWK für schnelle feldorientierte Verarbeitung, Python für komplexere Skripte und sed für unkomplizierte Textersetzungen.
Fazit
AWK ist ein vergleichsweise einfaches, gleichzeitig aber leistungsfähiges Werkzeug zur Textverarbeitung unter Linux und Unix. Ganz gleich, ob du eine bestimmte Spalte aus einer Datei auslesen, Werte addieren, eine Logdatei analysieren oder entscheiden möchtest, ob AWK, grep oder sed für eine konkrete Aufgabe besser geeignet ist: Die Beispiele in diesem Tutorial vermitteln dir eine solide Grundlage für die Arbeit mit AWK.


