Der Befehl awk verarbeitet Text zeilenweise und spaltenweise. Du definierst Muster und Aktionen, awk wendet sie auf jede Zeile an. Das macht ihn zum perfekten Werkzeug für Logdateien, CSV-Daten und tabellarische Ausgaben anderer Befehle.
Syntax
awk 'MUSTER { AKTION }' DATEI
- MUSTER – Bestimmt, welche Zeilen verarbeitet werden.
- AKTION – Legt fest, was mit den passenden Zeilen geschieht.
- DATEI – Die Eingabedatei (ohne Angabe liest awk von stdin).
Wie awk Daten verarbeitet
Awk teilt jede Zeile automatisch in Felder auf. Standardmäßig trennt Whitespace (Leerzeichen, Tabs) die Felder.
Du greifst auf Felder mit $1, $2, $3 usw. zu. $0 enthält die gesamte Zeile, $NF das letzte Feld.
# Visualisierung der Feldnummern
tmpfs 788M 1.8M 786M 1% /run/lock
|-----| |---| |---| |---| |-| |--------|
$1 $2 $3 $4 $5 $6
Für die folgenden Beispiele verwenden wir diese Datei teams.txt:
Bucks Milwaukee 60 22 0.732
Raptors Toronto 58 24 0.707
76ers Philadelphia 51 31 0.622
Celtics Boston 49 33 0.598
Pacers Indiana 48 34 0.585
Felder ausgeben
Gib bestimmte Spalten aus, indem du die Feldnummern angibst:
awk '{ print $1, $3 }' teams.txt
Ausgabe:
Bucks 60
Raptors 58
76ers 51
Celtics 49
Pacers 48
Das Komma zwischen $1 und $3 erzeugt ein Leerzeichen in der Ausgabe. Ohne Komma werden die Werte direkt aneinandergehängt.
Muster verwenden
Nach Text filtern
Verarbeite nur Zeilen, die ein bestimmtes Muster enthalten:
awk '/0.5/ { print $1 }' teams.txt
Ausgabe:
Celtics
Pacers
Mit regulären Ausdrucken filtern
Zeige Teams, deren Name mit einer Ziffer beginnt:
awk '/^[0-9]/ { print $1 }' teams.txt
Ausgabe:
76ers
Felder gezielt prüfen
Prüfe ein bestimmtes Feld mit dem Vergleichsoperator ~:
awk '$2 ~ /ia/ { print $1 }' teams.txt
Ausgabe (Städte mit “ia”):
76ers
Pacers
Mit !~ filterst du Zeilen, bei denen das Muster nicht zutrifft:
awk '$2 !~ /ia/ { print $1 }' teams.txt
Numerische Vergleiche
Zeige Teams mit mehr als 50 Siegen:
awk '$3 > 50 { print $1, $3 }' teams.txt
Ausgabe:
Bucks 60
Raptors 58
76ers 51
Mehrere Bedingungen kombinieren
Verwende && (UND) oder || (ODER):
awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
Ausgabe:
Bucks
Raptors
Bereichsmuster
Verarbeite alle Zeilen von einem Startmuster bis zu einem Endmuster:
awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Ausgabe:
Raptors
76ers
Celtics
BEGIN und END
Der Block BEGIN wird vor der ersten Zeile ausgeführt, END nach der letzten.
awk 'BEGIN { print "Team-Statistik" } { print $1 } END { print "---Ende---" }' teams.txt
Ausgabe:
Team-Statistik
Bucks
Raptors
76ers
Celtics
Pacers
---Ende---
Das ist praktisch, um Überschriften zu erzeugen oder Summen zu berechnen:
awk '{ sum += $3 } END { print "Siege gesamt:", sum }' teams.txt
Ausgabe:
Siege gesamt: 266
Eingebaute Variablen
| Variable | Bedeutung |
|---|---|
NF | Anzahl der Felder in der aktuellen Zeile |
NR | Nummer der aktuellen Zeile |
FS | Feldtrennzeichen (Standard: Whitespace) |
OFS | Ausgabe-Feldtrennzeichen |
FILENAME | Name der aktuellen Eingabedatei |
Zeilennummern ausgeben:
awk '{ print NR, $0 }' teams.txt
Ausgabe:
1 Bucks Milwaukee 60 22 0.732
2 Raptors Toronto 58 24 0.707
3 76ers Philadelphia 51 31 0.622
4 Celtics Boston 49 33 0.598
5 Pacers Indiana 48 34 0.585
Das Feldtrennzeichen andern
Standardmäßig trennt Whitespace die Felder. Mit -F oder der Variable FS änderst du das Trennzeichen.
Beispiel für /etc/passwd (Doppelpunkt als Trennzeichen):
awk -F ':' '{ print $1, $6 }' /etc/passwd
Das zeigt Benutzernamen und Home-Verzeichnisse.
Du kannst auch reguläre Ausdrücke als Trennzeichen verwenden:
awk -F '[,;]' '{ print $1 }' datei.csv
Das trennt an Kommas oder Semikolons.
Formatierte Ausgabe mit printf
Für kontrollierte Formatierung verwendest du printf:
awk '{ printf "%3d. %-10s %d Siege\n", NR, $1, $3 }' teams.txt
Ausgabe:
1. Bucks 60 Siege
2. Raptors 58 Siege
3. 76ers 51 Siege
4. Celtics 49 Siege
5. Pacers 48 Siege
printf fügt keinen automatischen Zeilenumbruch ein, deshalb brauchst du \n.
Praktische Beispiele
Bestimmte Zeilen extrahieren
Die ersten 5 Zeilen ausgeben:
awk 'NR <= 5' logfile.txt
Zeilen 10 bis 20:
awk 'NR >= 10 && NR <= 20' logfile.txt
Summen und Durchschnitte berechnen
awk '{ sum += $3; count++ } END { print "Durchschnitt:", sum/count }' teams.txt
Das letzte Feld jeder Zeile ausgeben
awk '{ print $NF }' teams.txt
Leere Zeilen überspringen
awk 'NF > 0' datei.txt
Mehrere Dateien verarbeiten
awk '{ print FILENAME, $0 }' *.log
Shell-Variablen verwenden
Übergib Shell-Variablen mit der Option -v:
limit=50
awk -v n="$limit" '$3 > n { print $1 }' teams.txt
Awk-Programme in Dateien
Bei komplexeren Aufgaben lagerst du das Programm in eine Datei aus:
# analyse.awk
BEGIN { print "Auswertung:" }
$3 > 50 { print $1, "hat", $3, "Siege" }
END { print "Fertig." }
Aufruf:
awk -f analyse.awk teams.txt
Du kannst die Datei auch direkt ausführbar machen:
#!/usr/bin/awk -f
BEGIN { print "Start" }
{ print NR, $1 }
Nach chmod +x script.awk startest du es mit ./script.awk datei.txt.
Zusammenfassung
Awk verarbeitet Text spaltenweise und zeilenweise. Du definierst Muster, um Zeilen zu filtern, und Aktionen, um Daten zu extrahieren oder zu berechnen. Die Kombination aus eingebauten Variablen wie NF, NR und $1-$N macht awk zu einem der effizientesten Werkzeuge für Textverarbeitung auf der Kommandozeile.