AWK-Befehl unter Linux und Unix: Syntax, Beispiele und Textverarbeitung

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 führt von dir definierte Muster-Aktions-Regeln aus. Dadurch lassen sich Daten filtern, verändern, analysieren oder für Auswertungen aufbereiten. Der Name AWK setzt sich aus den Nachnamen seiner Entwickler Alfred Aho, Peter Weinberger und Brian Kernighan zusammen. Seit 1977 gehört AWK zur Unix-Welt und ist bis heute ein zuverlässiges Werkzeug für die Linux-Administration.

Besonders hilfreich ist AWK, wenn du einzelne Spalten aus strukturierten Textdaten 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.

Dieses Tutorial erklärt die Syntax von AWK und zeigt praktische Beispiele für Musterabgleiche, Feldtrenner und integrierte Variablen. Außerdem wird erläutert, wie sich AWK von anderen Werkzeugen zur Textverarbeitung wie grep und sed unterscheidet.

Wichtige Grundlagen

  • AWK verarbeitet Text zeilenweise und teilt jede Zeile anhand eines festgelegten Feldtrenners in Felder wie $1, $2 oder $NF auf.
  • 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 -F lässt sich der Feldtrenner definieren, beispielsweise -F, für CSV-Dateien oder -F: für durch Doppelpunkte getrennte Daten.
  • Zu den wichtigen integrierten Variablen gehören NR für die aktuelle Zeilennummer, NF für die Anzahl der Felder, FS für den Eingabe-Feldtrenner, OFS für den Ausgabe-Feldtrenner, RS für den Eingabe-Datensatztrenner und ORS für den Ausgabe-Datensatztrenner.
  • Ein BEGIN-Block wird ausgeführt, bevor AWK die Eingabe verarbeitet. Er eignet sich beispielsweise zum Initialisieren von Variablen, zum Festlegen von Einstellungen oder zum Ausgeben von Überschriften.
  • Ein END-Block wird ausgeführt, nachdem sämtliche Eingaben verarbeitet wurden. Er eignet sich für Zusammenfassungen, Gesamtsummen und abschließende Berechnungen.
  • AWK eignet sich besonders gut zum Extrahieren von Spalten, Berechnen von Werten, Umwandeln strukturierter Texte sowie zum Zusammenfassen von Daten aus Log- oder CSV-Dateien.
  • Für einfache Suchvorgänge eignet sich grep, während sed häufig für Textersetzungen und Änderungen verwendet wird. Sobald Felder, Berechnungen zwischen Spalten oder individuell formatierte Ausgaben benötigt werden, ist AWK häufig die passendere Wahl.

Linux-Workloads lassen sich auf skalierbarer und zuverlässiger Cloud-Computing-Infrastruktur für Entwickler ausführen.

Voraussetzungen

Um diesem Tutorial folgen zu können, benötigst du:

  • Ein Linux- oder Unix-System mit installiertem AWK. Viele Distributionen enthalten standardmäßig GNU AWK (gawk). Die installierte Version kannst du mit awk --version überprüfen.
  • Grundkenntnisse im Umgang mit der Linux-Kommandozeile.

Was ist der AWK-Befehl unter Linux und Unix?

AWK ist sowohl eine Sprache zur Mustersuche als auch ein Werkzeug zur Verarbeitung von Text. Du definierst Regeln im Format pattern { action }, die AWK anschließend für jede Eingabezeile überprüft. Entspricht eine Zeile dem angegebenen Muster, wird die zugehörige Aktion ausgeführt. Wird kein Muster angegeben, gilt die Aktion für sämtliche Zeilen.

GNU AWK, meist als gawk bezeichnet, gehört zu den am häufigsten eingesetzten AWK-Implementierungen und wird auf vielen Linux-Distributionen als standardmäßiger awk-Interpreter verwendet. Es erweitert den ursprünglichen POSIX-AWK-Standard unter anderem um eine verbesserte Unicode-Unterstützung und zusätzliche Funktionen für die Verarbeitung von Zeichenketten. Die installierte Version lässt sich mit folgendem Befehl anzeigen:

Auf einem typischen Linux-System kann die Ausgabe beispielsweise folgendermaßen 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

AWK, grep und sed dienen zwar alle der Verarbeitung von Text, verfolgen jedoch unterschiedliche Schwerpunkte. grep sucht nach Zeilen, die einem bestimmten Muster entsprechen, und gibt diese Zeilen aus. sed wird für Ersetzungen und andere Bearbeitungsvorgänge innerhalb von Textströmen verwendet. AWK kann ähnliche Aufgaben übernehmen, versteht darüber hinaus jedoch einzelne Felder, unterstützt Berechnungen und kann formatierte Auswertungen erzeugen.

Die wichtigsten Unterschiede lassen sich wie folgt zusammenfassen:

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 extrahieren, Berechnungen durchführen und Berichte erzeugen Ja Ja Ja

Weitere Informationen zu den einzelnen Werkzeugen findest du in Tutorials zum grep-Befehl und zum sed-Befehl.

AWK-Syntax und grundlegender Aufbau

Bei der Arbeit mit strukturierten Textdateien unter Linux oder Unix müssen häufig ähnliche Verarbeitungsschritte immer wieder durchgeführt werden. AWK vereinfacht diesen Ablauf, indem du lediglich die benötigten Muster und Aktionen definierst, während das Werkzeug die eigentliche Verarbeitung der Eingabe übernimmt.

Aufbau eines AWK-Befehls

Die grundlegende AWK-Syntax lautet:

awk options 'pattern { action }' input-file

Die erzeugte Ausgabe kann außerdem in eine Datei umgeleitet werden:

awk options 'pattern { action }' input-file > output-file

Zu den häufig verwendeten Optionen gehören:

  • -F legt den Feldtrenner fest, beispielsweise -F: für Dateien, deren Felder mit Doppelpunkten voneinander getrennt sind.
  • -f weist AWK an, Regeln aus einer Skriptdatei zu laden, anstatt sie direkt über die Kommandozeile zu übergeben.
  • -v ermöglicht das Zuweisen einer Variablen, bevor AWK mit der Verarbeitung der Eingabe beginnt.

Muster- und Aktionsblöcke verstehen

Eine AWK-Regel besteht aus einem Muster und einer in geschweiften Klammern geschriebenen Aktion. Beide Bestandteile können weggelassen werden:

  • Fehlt das Muster, wird die Aktion für jede Eingabezeile ausgeführt.
  • Fehlt der Aktionsblock, 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
awk '/error/' file.txt

AWK-Befehl unter Linux ausführen

AWK eignet sich für strukturierte Texte, wenn einzelne Spalten schnell ausgewählt, verändert oder zusammengefasst werden sollen. Bevor komplexere Beispiele folgen, ist es sinnvoll, zunächst die grundlegenden Möglichkeiten zum Ausführen eines AWK-Befehls unter Linux kennenzulernen.

Eine Beispieldatei erstellen

Für die Beispiele in diesem Tutorial wird eine Datei namens file.txt verwendet. Erstelle sie zunächst, damit du die folgenden Befehle 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 Beispieldatei besteht aus vier Spalten: Item, Model, Country und Cost.

AWK auf eine Datei anwenden

Der Name der Eingabedatei wird als letztes Argument angegeben:

awk '{ print $0 }' file.txt

Die Variable $0 steht für die gesamte aktuelle Zeile. Der Befehl erzeugt folgende Ausgabe:

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 Eingaben aus der Kommandozeile verwenden

Anstatt Daten aus einer Datei einzulesen, kannst du die Ausgabe eines anderen Befehls direkt über eine Pipe an AWK weitergeben:

echo "Alice Engineering 95000" | awk '{ print $1, "works in", $2 }'

Die Ausgabe lautet:

Alice works in Engineering

AWK über eine Skriptdatei ausführen

Bei längeren oder wiederverwendbaren AWK-Programmen können die Regeln in einer separaten Datei gespeichert und anschließend mit der Option -f geladen werden:

# 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 Feldtrenners in einzelne Felder. Standardmäßig dienen beliebige Leerzeichen und Tabulatoren als Trennzeichen.

Den standardmäßigen Feldtrenner verwenden

Die Felder werden von AWK beginnend mit $1 nummeriert. $0 bezeichnet dagegen immer die vollständige Zeile.

Um die zweite und dritte Spalte auszugeben, verwendest du:

awk '{ print $2 "\t" $3 }' file.txt

Die Ausgabe ist:

Model   Country
iPhone  USA
MacBook USA
Galaxy  Korea
iPad    USA
Sony    Japan

Einen eigenen Feldtrenner mit -F festlegen

Wenn die Eingabedaten andere Trennzeichen als Leerzeichen verwenden, kannst du die Option -F einsetzen. Das ist beispielsweise bei CSV-Daten oder Systemdateien wie /etc/passwd hilfreich, deren Felder durch Doppelpunkte getrennt sind.

# Das erste Feld (Benutzername) aus /etc/passwd ausgeben
awk -F: '{ print $1 }' /etc/passwd | head -5

Die Ausgabe lautet:

Bestimmte Spalten mit $1, $2 und $NF ausgeben

Die besondere Referenz $NF steht immer für das letzte Feld einer Zeile, unabhängig davon, aus wie vielen Feldern der jeweilige Datensatz besteht.

# Das erste und das letzte Feld ausgeben
awk '{ print $1, $NF }' file.txt

Das Ergebnis ist:

Item Cost
Phone 999
Laptop 1299
Watch 299
Tablet 499
Camera 799

Integrierte AWK-Variablen im Überblick

AWK stellt verschiedene vordefinierte Variablen zur Verfügung. Sie liefern Informationen über die aktuelle Eingabe und ermöglichen gleichzeitig die Steuerung der Ein- und Ausgabeformatierung.

NR, NF, FS, RS, OFS und ORS erklärt

Variable Beschreibung
NR Nummer des aktuellen Datensatzes beziehungsweise der aktuellen Zeile, beginnend bei 1
NF Anzahl der Felder in der aktuellen Zeile
FS Feldtrenner für die Eingabe; standardmäßig Leerzeichen
RS Datensatztrenner für die Eingabe; standardmäßig ein Zeilenumbruch
OFS Feldtrenner für die Ausgabe; standardmäßig ein Leerzeichen
ORS Datensatztrenner für die Ausgabe; standardmäßig ein Zeilenumbruch

Praktische Beispiele mit integrierten Variablen

Mit NR kannst du jede Zeile zusammen mit ihrer jeweiligen Zeilennummer ausgeben:

awk '{ print NR, $0 }' file.txt

Die Ausgabe lautet:

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 zwischen den ausgegebenen Feldern ändern. Das folgende Beispiel erzeugt eine durch Kommas getrennte Ausgabe:

awk 'BEGIN { OFS="," } { print $1, $2, $3 }' file.txt

Die Ausgabe sieht anschließend so aus:

Item,Model,Country
Phone,iPhone,USA
Laptop,MacBook,USA
Watch,Galaxy,Korea
Tablet,iPad,USA
Camera,Sony,Japan

Mit NF kannst du anzeigen, wie viele Felder jede einzelne Zeile enthält:

awk '{ print NF, $0 }' file.txt

Das Ergebnis lautet:

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 für die Mustersuche

Die folgenden Beispiele zeigen verschiedene Möglichkeiten, wie sich Text mit AWK anhand von Mustern finden und weiterverarbeiten lässt.

Zeilen finden, die eine bestimmte Zeichenfolge enthalten

Um sämtliche Zeilen auszugeben, die den Buchstaben o enthalten, verwendest du:

awk '/o/ { print $0 }' file.txt

Die Ausgabe ist:

Item    Model   Country Cost
Phone   iPhone  USA     999
Laptop  MacBook USA     1299
Watch   Galaxy  Korea   299
Camera  Sony    Japan   799

Um zu ermitteln, wie viele Zeilen einem bestimmten Muster entsprechen, kannst du einen Zähler erhöhen und dessen endgültigen Wert in einem END-Block ausgeben:

awk '/a/ { ++cnt } END { print "Count = ", cnt }' file.txt

Die Ausgabe lautet:

Reguläre Ausdrücke mit AWK verwenden

AWK unterstützt reguläre Ausdrücke innerhalb der Schreibweise /pattern/. Der folgende Ausdruck wählt Zeilen aus, die mit einem Großbuchstaben beginnen, auf den ein Kleinbuchstabe folgt:

awk '/^[A-Z][a-z]/ { print $0 }' file.txt

Die Ausgabe lautet:

Phone   iPhone  USA     999
Laptop  MacBook USA     1299
Watch   Galaxy  Korea   299
Tablet  iPad    USA     499
Camera  Sony    Japan   799

Bestimmte Feldwerte vergleichen

Wenn nicht die gesamte Zeile, sondern nur ein bestimmtes Feld geprüft werden soll, kannst du statt eines regulären Ausdrucks einen direkten 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

AWK kann Datensätze ebenfalls anhand numerischer Werte filtern:

# Zeilen ausgeben, bei denen Cost (Feld 4) größer als 500 ist
awk '$4 > 500 { print $0 }' file.txt

Die Ausgabe ist:

Item    Model   Country Cost
Phone   iPhone  USA     999
Laptop  MacBook USA     1299
Camera  Sony    Japan   799

Wenn nur Zeilen mit mehr als 20 Zeichen ausgegeben werden sollen, kannst du die integrierte AWK-Funktion length verwenden:

awk 'length($0) > 20' file.txt

BEGIN- und END-Blöcke in AWK

AWK kann deutlich mehr als einzelne Zeilen zu filtern. Mit den Blöcken BEGIN und END lassen sich Einstellungen vorbereiten, bevor die eigentliche Eingabe verarbeitet wird, und abschließende Auswertungen durchführen, nachdem sämtliche Datensätze gelesen wurden.

Was BEGIN und END bewirken

BEGIN und END sind besondere Muster innerhalb von AWK:

  • Der BEGIN-Block wird genau einmal ausgeführt, bevor AWK Eingabedaten einliest. Er kann zum Initialisieren von Variablen, Festlegen von Trennzeichen oder Ausgeben von Überschriften verwendet werden.
  • Der END-Block wird einmal ausgeführt, nachdem AWK sämtliche Eingaben verarbeitet hat. Er eignet sich insbesondere für Summen und Zusammenfassungen.

BEGIN vor der Verarbeitung einsetzen

awk 'BEGIN { print "Item\tCost"; print "----\t----" } NR > 1 { print $1 "\t" $4 }' file.txt

Die Ausgabe ist:

Item    Cost
----    ----
Phone   999
Laptop  1299
Watch   299
Tablet  499
Camera  799

END für Zusammenfassungen nach der Verarbeitung einsetzen

awk 'BEGIN { print "Starting AWK processing..." } { print $1 } END { print "Done. Processed " NR " lines." }' file.txt

Die Ausgabe lautet:

Starting AWK processing...
Item
Phone
Laptop
Watch
Tablet
Camera
Done. Processed 6 lines.

Bedingte Logik und Kontrollstrukturen in AWK

Manche Aufgaben bei der Datenverarbeitung gehen über eine einfache Mustersuche hinaus. AWK bietet Kontrollstrukturen, mit denen sich Zusammenfassungen berechnen, Datensätze verfolgen, Werte initialisieren und bedingte Operationen durchführen lassen. Dadurch können auch komplexere Verarbeitungsschritte effizient und flexibel umgesetzt werden.

if- und if-else-Anweisungen in AWK

AWK unterstützt if, if-else sowie verschachtelte Bedingungen innerhalb von Aktionsblöcken.

# Artikel anhand von Cost als teuer oder günstig kennzeichnen
awk 'NR > 1 { if ($4 > 500) print $1, "is expensive"; else print $1, "is affordable" }' file.txt

Der Befehl erzeugt folgende Ausgabe:

Phone is expensive
Laptop is expensive
Watch is affordable
Tablet is affordable
Camera is expensive

Mehrere Bedingungen können mit && für ein logisches UND oder mit || für ein logisches ODER miteinander kombiniert werden:

# Artikel aus den USA ausgeben, deren Cost größer als 500 ist
awk '$3 == "USA" && $4 > 500 { print $0 }' file.txt

Die Ausgabe lautet:

Phone   iPhone  USA     999
Laptop  MacBook USA     1299

Schleifen in AWK: for und while

AWK unterstützt sowohl for– als auch while-Schleifen. Eine Schleife ist beispielsweise hilfreich, wenn alle Felder eines bestimmten Datensatzes nacheinander verarbeitet werden sollen:

# Jedes Feld einzeln zusammen mit seiner Feldnummer ausgeben
awk 'NR == 2 { for (i = 1; i <= NF; i++) print "Field " i ": " $i }' file.txt

Das Ergebnis ist:

Field 1: Phone
Field 2: iPhone
Field 3: USA
Field 4: 999

Eine while-Schleife kann auf vergleichbare Weise eingesetzt werden:

awk 'BEGIN { i = 1; while (i <= 5) { print "Line:", i; i++ } }'

Die Ausgabe lautet:

Line: 1
Line: 2
Line: 3
Line: 4
Line: 5

Praktische AWK-Anwendungsfälle und Beispiele

Die folgenden praxisnahen Beispiele zeigen, wie AWK direkt im Terminal für typische Aufgaben der Datenverarbeitung eingesetzt werden kann.

/etc/passwd mit AWK auswerten

Die Datei /etc/passwd verwendet Doppelpunkte als Feldtrenner und enthält pro Zeile einen Benutzerdatensatz. Mit AWK und der Option -F: lassen sich einzelne Felder daraus unkompliziert extrahieren.

# Benutzername und Standardshell jedes Benutzers ausgeben
awk -F: '{ print $1, $7 }' /etc/passwd | head -5

Auf einem typischen Ubuntu-System kann die Ausgabe folgendermaßen aussehen:

root /bin/bash
daemon /usr/sbin/nologin
bin /usr/sbin/nologin
sys /usr/sbin/nologin
sync /bin/sync

Um ausschließlich Benutzer auszugeben, deren Shell auf /bin/bash gesetzt 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

Um den Namen und die Abteilung jedes Mitarbeiters auszugeben und dabei die Kopfzeile zu überspringen, verwendest du:

awk -F, 'NR > 1 { print $1, "works in", $2 }' employees.csv

Die Ausgabe ist:

Alice works in Engineering
Bob works in Marketing
Charlie works in Engineering
Diana works in HR
Eve works in Marketing

System-Logdateien mit AWK zusammenfassen

Erstelle 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

Um sämtliche IP-Adressen auszugeben, deren Anfrage den Statuscode 200 zurückgegeben hat, verwendest du:

awk '$4 == 200 { print $1 }' access.log

Die Ausgabe lautet:

192.168.1.1
192.168.1.3
192.168.1.4

Um zu zählen, wie viele 404-Fehler in der Datei vorkommen, führst du folgenden Befehl aus:

awk '$4 == 404 { count++ } END { print "404 errors:", count }' access.log

Das Ergebnis lautet:

Spaltenwerte mit AWK summieren

Um sämtliche Werte aus der Spalte Cost in file.txt zu addieren und dabei die Überschrift zu überspringen, verwendest du:

awk 'NR > 1 { sum += $4 } END { print "Total cost:", sum }' file.txt

Die Ausgabe ist:

Auf ähnliche Weise lässt sich auch ein Durchschnitt berechnen:

awk -F, 'NR > 1 { sum += $3; count++ } END { print "Average salary:", sum / count }' employees.csv

Die Ausgabe lautet:

AWK-Ausgabe in einer Datei speichern

Wenn die von AWK erzeugten Ergebnisse gespeichert werden sollen, kannst du die Ausgabe mit dem Operator > in eine Datei umleiten:

awk '/a/ { print $3 "\t" $4 }' file.txt > output.txt

Mit cat kannst du anschließend den gespeicherten Inhalt überprüfen:

Die Datei enthält:

USA     1299
Korea   299
USA     499
Japan   799

AWK vs. sed vs. grep: Welches Werkzeug eignet sich wann?

Szenario Geeignetes Werkzeug
Zeilen suchen, die ein bestimmtes Muster enthalten grep
Text innerhalb einer Datei suchen und ersetzen sed
Eine bestimmte Spalte aus strukturierten Textdaten extrahieren awk
Berechnungen mit Spaltenwerten durchführen awk
Formatierte Berichte oder Zusammenfassungen erzeugen awk
Einfache einzeilige Ersetzungen innerhalb eines Skripts durchführen sed
Logzeilen anhand einer festen Zeichenfolge filtern grep
CSV-Dateien oder durch Doppelpunkte getrennte Dateien verarbeiten awk

Verwende grep, wenn du hauptsächlich feststellen möchtest, ob ein Muster vorkommt, und die passenden Zeilen ausgeben willst. sed eignet sich, wenn Text ersetzt oder entfernt werden soll. awk ist besonders geeignet, wenn einzelne Felder, Wertvergleiche, Berechnungen oder Ausgaben auf Grundlage mehrerer Spalten benötigt werden.

Für ausführlichere Informationen kannst du Tutorials zum grep-Befehl und zum sed-Befehl verwenden.

Häufig gestellte Fragen zu AWK

1. Was ist der AWK-Befehl unter Unix?

AWK ist ein leistungsfähiges Werkzeug zur Textverarbeitung, das unter Linux und Unix verfügbar ist. Es wurde für Mustersuche und Auswertungen entwickelt und verarbeitet Dateien oder Datenströme zeilenweise. Jede Eingabezeile wird automatisch anhand eines Trennzeichens in einzelne Felder zerlegt, wobei standardmäßig Leerzeichen verwendet werden. Anschließend können individuell definierte Muster-Aktions-Regeln angewendet werden, um Datensätze zu filtern, Spalten auszulesen, Berechnungen durchzuführen, Berichte zu erstellen und weitere Verarbeitungsschritte vorzunehmen. Da AWK direkt mit einzelnen Feldern arbeiten kann, eignet es sich besonders gut für strukturierte oder getrennte Daten wie CSV-Dateien, Konfigurationsdateien und Logdateien.

2. Wie führt man den AWK-Befehl unter Linux aus?

Ein typischer AWK-Befehl verwendet folgende Syntax:

awk 'pattern { action }' filename

AWK überprüft für jede Zeile der angegebenen Datei das Muster und führt die zugehörige Aktion aus, wenn das Muster zutrifft. Wird das Muster weggelassen, gilt die Aktion für jede Zeile. Daten können außerdem über eine Pipeline von einem anderen Befehl an AWK übergeben werden, beispielsweise mit command | awk '{ action }'. Dadurch lässt sich AWK unkompliziert in Shell-Pipelines integrieren. AWK kann mehrere Eingabedateien gleichzeitig verarbeiten. Mit Kommandozeilenoptionen wie -F lässt sich ein Feldtrenner definieren, während -f ein umfangreicheres AWK-Programm aus einer externen Datei lädt. Diese Flexibilität macht AWK für zahlreiche Aufgaben der Textverarbeitung und Automatisierung geeignet.

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 nutzt AWK Leerzeichen als Feldtrenner, weshalb $1 für das erste durch Leerraum getrennte Wort oder den ersten Wert steht.

Enthält eine Eingabezeile beispielsweise Name Age Country, würde der Befehl lediglich den Bestandteil Name ausgeben. Auf diese Weise lässt sich die erste Spalte strukturierter Daten schnell extrahieren.

4. Was macht awk '{ print $2 }'?

Der Befehl awk '{ print $2 }' liest das zweite Feld jeder Eingabezeile aus und gibt es aus. Wird beispielsweise eine Zeile wie John 30 Engineer verarbeitet, gibt AWK den Wert 30 aus, da $2 das zweite Feld bezeichnet. Nach demselben Prinzip können beliebige Spalten aus tabellarischen oder durch Leerzeichen getrennten Daten extrahiert werden.

5. Wofür wird die Option -F in AWK verwendet?

Die Option -F definiert den Feldtrenner, mit dem AWK jede Eingabezeile in einzelne Felder zerlegt. Standardmäßig verwendet AWK Leerzeichen, mit -F kann jedoch ein anderes Trennzeichen oder ein regulärer Ausdruck festgelegt werden. Der Befehl awk -F: '{ print $1 }' /etc/passwd weist AWK beispielsweise an, den Doppelpunkt (:) als Feldtrenner zu verwenden. Das ist besonders bei Dateien wie /etc/passwd hilfreich, deren Felder durch Doppelpunkte voneinander getrennt sind. Dadurch lässt sich AWK flexibel für viele unterschiedliche Arten strukturierter Daten einsetzen.

6. Was bedeuten NR und NF in AWK?

NR und NF gehören zu den wichtigsten integrierten AWK-Variablen. NR steht für „Number of Record“ und enthält die Nummer des Datensatzes, der aktuell verarbeitet wird. Der Wert erhöht sich automatisch, während AWK die Eingabe durchläuft. Dadurch eignet sich NR beispielsweise zum Nummerieren von Ausgaben oder zum Ausführen einer Aktion nur für bestimmte Zeilen.

NF steht für „Number of Fields“ und enthält die Anzahl der Felder innerhalb des aktuellen Datensatzes. Das ist insbesondere dann hilfreich, wenn Zeilen unterschiedlich viele Spalten besitzen oder das letzte Feld über $NF angesprochen werden soll. 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-Programmiersprache und dient auf vielen modernen Linux-Distributionen als standardmäßiger AWK-Interpreter. Während traditionelles AWK dem POSIX-Standard folgt, erweitert gawk die Sprache um zusätzliche Funktionen. Dazu gehören eine verbesserte Unterstützung für Unicode und Multibyte-Zeichen, zusätzliche Funktionen für Zeichenketten und Berechnungen, integrierte Netzwerkfunktionen sowie erweiterte Kommandozeilenoptionen. Die meisten für Standard-AWK geschriebenen Programme funktionieren auch mit gawk, während die GNU-Variante zusätzliche Möglichkeiten für komplexere Aufgaben der Textverarbeitung bietet.

8. Wann sollte AWK anstelle von Python oder sed verwendet werden?

AWK eignet sich besonders für kurze Einzeiler, bei denen Spalten extrahiert, Daten anhand von Feldern gefiltert oder Text direkt innerhalb einer Shell-Pipeline verarbeitet werden soll. Das gilt insbesondere für strukturierte tabellarische Daten. Wenn eine Aufgabe umfangreichere Programmierlogik, komplexe Datenverarbeitung oder die Anbindung an andere Systeme benötigt, kann Python aufgrund seiner umfangreichen Bibliotheken und seiner guten Wartbarkeit bei größeren Programmen die geeignetere Lösung sein. sed eignet sich dagegen besonders für einfache Ersetzungen und zeilenweise Änderungen innerhalb von Dateien oder Textströmen. Zusammengefasst eignet sich AWK für schnelle feldorientierte Verarbeitung, Python für komplexere Skripte und sed für einfache Textersetzungen.

Fazit

AWK ist ein einfach zu verwendendes und zugleich leistungsfähiges Werkzeug zur Textverarbeitung unter Linux und Unix. Ganz gleich, ob du eine bestimmte Spalte aus einer Datei extrahieren, Werte summieren, Logdaten untersuchen oder entscheiden möchtest, ob AWK, grep oder sed für eine bestimmte Aufgabe besser geeignet ist: Die Beispiele in diesem Tutorial vermitteln eine solide Grundlage für die Arbeit mit AWK.

Quelle: digitalocean.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren: