linux-cli-shell cli text-processing awk scripting reporting advanced

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 jq oder 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)