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,$2oder$NFauf. - 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
-Flä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
NRfür die aktuelle Zeilennummer,NFfür die Anzahl der Felder,FSfür den Eingabe-Feldtrenner,OFSfür den Ausgabe-Feldtrenner,RSfür den Eingabe-Datensatztrenner undORSfü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ährendsedhä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 mitawk --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:
awk --version
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:
-Flegt den Feldtrenner fest, beispielsweise-F:für Dateien, deren Felder mit Doppelpunkten voneinander getrennt sind.-fweist AWK an, Regeln aus einer Skriptdatei zu laden, anstatt sie direkt über die Kommandozeile zu übergeben.-vermö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:
root
daemon
bin
sys
sync
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:
Count = 4
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:
404 errors: 1
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:
Total cost: 3895
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:
Average salary: 79600
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:
cat output.txt
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.


