awk
Text, Pipes & Filter
Was ist awk?
awk ist eine kleine Programmiersprache zum Verarbeiten von spaltenbasiertem Text. Sie liest Zeile für Zeile, zerlegt jede Zeile automatisch in Felder und führt darauf Aktionen aus. Für Tabellen, Logdateien und CSV-ähnliche Daten ist awk ideal – oft mächtiger als grep oder sed.
Felder: $1, $2, $0
awk nummeriert die Spalten einer Zeile: $1 ist das erste Feld, $2 das zweite usw. $0 ist die gesamte Zeile, NF die Anzahl der Felder, NR die aktuelle Zeilennummer:
$ echo "anna bob carla" | awk '{print $2}'
bob
$ cat /etc/passwd | awk -F: '{print $1}' # erste Spalte (Benutzername)
$ ls -l | awk '{print $9, $5}' # Name und Größe
Mit -F setzt du das Feldtrennzeichen (FS). -F: trennt an Doppelpunkten – perfekt für /etc/passwd.
Muster und Aktionen
Ein awk-Programm hat die Form muster { aktion }. Die Aktion wird nur für Zeilen ausgeführt, die zum Muster passen:
$ awk '/error/ {print $0}' server.log # Zeilen mit "error"
$ awk '$3 > 1000 {print $1}' daten.txt # wenn Feld 3 > 1000
$ awk 'NR==1 {print}' datei.txt # nur erste Zeile
Fehlt das Muster, gilt die Aktion für alle Zeilen. Fehlt die Aktion, wird die Zeile einfach ausgegeben.
Rechnen und Zusammenfassen
awk kann zählen und rechnen. Die Blöcke BEGIN und END laufen vor bzw. nach der Verarbeitung:
$ awk '{summe += $2} END {print "Summe:", summe}' zahlen.txt
$ awk -F: 'END {print NR, "Zeilen"}' /etc/passwd
$ awk '{print NR": "$0}' datei.txt # Zeilen nummerieren
| Variable | Bedeutung |
|---|---|
$1, $2 … | einzelne Felder |
$0 | ganze Zeile |
NF | Anzahl Felder |
NR | aktuelle Zeilennummer |
FS | Feldtrennzeichen |
Wie gibst du das erste Feld jeder Zeile aus?
Hinweise & Sicherheit
Standardmäßig trennt awk an beliebig vielen Leerzeichen/Tabs – für CSV mit Kommas brauchst du -F,. Setze awk-Programme in einfache Anführungszeichen, damit die Shell die $-Variablen nicht selbst ersetzt (mehr dazu unter Quoting). awk ändert keine Dateien direkt; es schreibt nur auf stdout – das macht es für Auswertungen ungefährlich, du leitest das Ergebnis bei Bedarf mit Umleitung in eine Datei.