Awk Masterclass: Field Processing (Artikel 255)
Tiefgehender Einstieg in die Programmiersprache awk. Erfahren Sie alles über Feld-Manipulation, Berechnungen im Datenstrom und die Erstellung von komplexen Reports.
# Awk Deep Dive: Der König der Spalten-Manipulation
TL;DR / Management Summary Während grep Zeilen findet und sed diese transformiert, “versteht” awk die Struktur einer Zeile (Felder/Spalten). Es ist keine einfache Applikation, sondern eine vollständige Programmiersprache. Ein Senior Admin nutzt
awk, um aus unstrukturierten Logfiles (z.B./var/log/access.log) saubere Statistiken zu erstellen, Werte in Spalten zu summieren oder Daten basierend auf numerischen Bedingungen zu filtern.
# 1. Einführung & Architektur
Alles ist eine Tabelle.
Awk betrachtet jede Zeile als einen Datensatz (Record) und bricht diesen automatisch in Felder (Fields) auf, basierend auf einem Trennzeichen (Standard: Leerzeichen/Tab).
# Die Feld-Referenzierung (Mermaid)
graph TD
A["Line: 192.168.1.1 GET /index.html 200"] --> B{Awk Parser}
B --> C["$1 (IP): 192.168.1.1"]
B --> D["$2 (Method): GET"]
B --> E["$3 (Path): /index.html"]
B --> F["$4 (Status): 200"]
B --> G["$0 (Full Line)"]
B --> H["NF (Number of Fields): 4"]
# 2. Grundlegende Nutzung
Felder extrahieren.
# Bestimmte Spalten drucken
# Zeige User und deren Shell aus der passwd
awk -F: '{ print $1, $7 }' /etc/passwd
-F:setzt den Feld-Separator auf den Doppelpunkt.
# Rechnen mit awk
Summieren Sie die Größe aller Dateien im aktuellen Verzeichnis:
ls -l | awk '{ sum += $5 } END { print "Gesamtgröße:", sum / 1024, "KB" }'
# 3. Logik und Filterung
Präzise Auswahl.
Awk kann Bedingungen prüfen, bevor eine Aktion ausgeführt wird.
# Numerische Filter
Zeige alle Prozesse, die mehr als 10% CPU verbrauchen:
ps aux | awk '$3 > 10.0 { print $1, $11 }'
# Regex Filter pro Feld
Zeige nur 404-Fehler aus dem Nginx-Log:
awk '$9 == "404" { print $1, $7 }' /var/log/nginx/access.log
# 4. Day-2 Operations: Fortgeschrittene Variablen
Zustands-Tracking.
- NR (Number of Records): Die aktuelle Zeilennummer.
- NF (Number of Fields): Anzahl der Spalten in der aktuellen Zeile.
- FS (Field Separator): Eingabe-Trennzeichen.
- OFS (Output Field Separator): Ausgabe-Trennzeichen.
# Beispiel: CSV zu TSV konvertieren
awk 'BEGIN { FS=","; OFS="\t" } { $1=$1; print }' data.csv
(Hinweis: $1=$1 erzwingt den Rebuild der Zeile mit dem neuen OFS).
# 5. Troubleshooting & “War Stories”
Wenn der Spaltenteufel zuschlägt.
# Story 1: “Die variablen Leerzeichen”
Symptom: Ein Admin nutzt awk -F' ' und wundert sich, dass mehrfache Leerzeichen als leere Spalten gewertet werden.
Ursache: Bei -F' ' (festes Leerzeichen) zählt jeder Space.
Lösung: Nutzen Sie den Default (einfach -F weglassen). Awk behandelt dann jede Folge von White-Space (Tab, Space) als einen einzigen Separator.
# Story 2: “Das hängende Skript (Large Files)”
Symptom: Ein Awk-Skript zur Log-Analyse frisst den gesamten RAM eines Servers.
Ursache: Der Admin nutzt ein assoziatives Array (count[$1]++), um IPs zu zählen. Bei Millionen von IPs wächst das Array im RAM, bis der OOM-Killer kommt.
Lösung: Sortieren Sie das File vorab (sort) und nutzen Sie awk nur, um aufeinanderfolgende Dubletten zu zählen – so muss sich awk nur eine IP gleichzeitig merken.
# 6. Fazit & Empfehlung
- Wahl: Nutzen Sie awk für alles, was mit Tabellen oder Logs zu tun hat.
- Zukunftssicherheit: Lernen Sie die grundlegende Syntax. Awk-Skripte von 1980 laufen heute noch unverändert auf SLES 15 oder Arch.
- Power: Für sehr komplexe Datenverarbeitung (z.B. JSON-Parsing) nutzen Sie lieber
jqoder Python.
# Anhang: Cheatsheet
| Aufgabe | Syntax |
|---|---|
| Erste Spalte | $1 |
| Letzte Spalte | $NF |
| Vorletzte Spalte | $(NF-1) |
| Zeilennummer | NR |
| Spaltenanzahl | NF |
| Text suchen | /pattern/ { action } |
| Block vor Start | BEGIN { ... } |
| Block nach Ende | END { ... } |
| If / Else | if (cond) { ... } else { ... } |
| String-Länge | length($1) |