Files
2026-09-02 16:32:50 +02:00

4.9 KiB

awk - Textverarbeitung und Datenextraktion

awk ist eine mächtige Programmiersprache für Textverarbeitung, besonders nützlich für spaltenbasierte Daten.

Grundsyntax

awk 'MUSTER { AKTION }' datei.txt

Spalten ausgeben

Einzelne Spalten

awk '{print $1}' datei.txt      # Erste Spalte
awk '{print $2}' datei.txt      # Zweite Spalte
awk '{print $NF}' datei.txt     # Letzte Spalte

$0 = ganze Zeile, $1 = erste Spalte, $2 = zweite, etc.

Mehrere Spalten

awk '{print $1, $3}' datei.txt
awk '{print $1 " - " $3}' datei.txt

Trennzeichen (Delimiter)

Standard (Leerzeichen/Tab)

awk '{print $1}' datei.txt

Eigenes Trennzeichen

awk -F: '{print $1}' /etc/passwd    # Doppelpunkt
awk -F, '{print $1, $3}' datei.csv  # Komma
awk -F'|' '{print $2}' datei.txt    # Pipe

Mehrere Trennzeichen

awk -F'[,:]' '{print $1}' datei.txt

Muster (Pattern)

Zeilen mit bestimmtem Text

awk '/ERROR/ {print}' logfile.txt
awk '/ERROR/' logfile.txt           # Kurzform

Reguläre Ausdrücke

awk '/^[0-9]/ {print}' datei.txt    # Zeilen mit Zahl am Anfang
awk '/ERROR|WARNING/' logfile.txt    # ERROR oder WARNING

Spaltenbasierte Bedingungen

awk '$3 > 100 {print}' datei.txt           # 3. Spalte > 100
awk '$1 == "root" {print}' /etc/passwd     # 1. Spalte = "root"
awk '$2 != "active" {print}' status.txt    # 2. Spalte ≠ "active"

Mehrere Bedingungen

awk '$3 > 100 && $4 < 200 {print}' datei.txt
awk '$1 == "Alice" || $1 == "Bob" {print}' datei.txt

Berechnungen

Summe

awk '{sum += $1} END {print sum}' zahlen.txt

Durchschnitt

awk '{sum += $1; count++} END {print sum/count}' zahlen.txt

Maximum/Minimum

awk 'BEGIN {max=0} {if($1>max) max=$1} END {print max}' zahlen.txt
awk 'NR==1 {min=$1} {if($1<min) min=$1} END {print min}' zahlen.txt

Formatierte Ausgabe

Mit printf

awk '{printf "%s: %d\n", $1, $2}' datei.txt
awk '{printf "%-10s %5d\n", $1, $2}' datei.txt  # Formatiert

Spalten ausrichten

awk '{printf "%-15s %10s\n", $1, $2}' datei.txt

Eingebaute Variablen

awk '{print NR, $0}' datei.txt      # NR = Zeilennummer
awk '{print NF, $0}' datei.txt      # NF = Anzahl Felder
awk 'NR==5 {print}' datei.txt       # Nur Zeile 5
awk 'NR>=10 && NR<=20' datei.txt    # Zeilen 10-20

Wichtige Variablen:

  • NR = Nummer der aktuellen Zeile
  • NF = Anzahl der Felder
  • FS = Field Separator (Eingabe)
  • OFS = Output Field Separator (Ausgabe)

BEGIN und END

awk 'BEGIN {print "Start"} {print} END {print "Ende"}' datei.txt
awk 'BEGIN {FS=":"; OFS="\t"} {print $1, $3}' /etc/passwd

Praktische Beispiele

/etc/passwd auswerten

# Alle Benutzernamen
awk -F: '{print $1}' /etc/passwd

# User mit UID >= 1000
awk -F: '$3 >= 1000 {print $1}' /etc/passwd

# User und Shell
awk -F: '{print $1 ": " $7}' /etc/passwd

Prozesse analysieren

# Speichernutzung
ps aux | awk '{sum += $6} END {print sum/1024 " MB"}'

# Top 5 Prozesse nach Speicher
ps aux | awk '{print $6, $11}' | sort -rn | head -5

CSV-Dateien

# Zweite Spalte summieren
awk -F, '{sum += $2} END {print sum}' data.csv

# Filtern und ausgeben
awk -F, '$3 > 1000 {print $1, $2}' sales.csv

Logfile-Analyse

# Nur ERROR-Zeilen mit Zeitstempel
awk '/ERROR/ {print $1, $2, $0}' app.log

# Fehler zählen
awk '/ERROR/ {count++} END {print count}' app.log

# Nach Zeit filtern
awk '$1 >= "2025-11-07" && $1 <= "2025-11-08"' log.txt

Apache/Nginx Logs

# IP-Adressen extrahieren
awk '{print $1}' access.log | sort | uniq -c | sort -rn

# Nur 404-Fehler
awk '$9 == 404 {print $7}' access.log

Duplikate zählen

awk '{count[$1]++} END {for(key in count) print key, count[key]}' datei.txt

Arrays

awk '{arr[$1] += $2} END {for (key in arr) print key, arr[key]}' datei.txt

Mehrere Dateien

awk '{print FILENAME, $0}' datei1.txt datei2.txt

Mit Pipes

cat datei.txt | awk '{print $1}'
ls -l | awk '{print $9, $5}'
df -h | awk 'NR>1 {print $1, $5}'

Komplexes Beispiel

# Benutzerdefinierte Funktion
awk '
  function celsius(f) {
    return (f - 32) * 5/9
  }
  {
    printf "%s: %.2f°C\n", $1, celsius($2)
  }
' temperatures.txt

Vergleich: awk vs. andere Tools

Task Tool
Spalten extrahieren awk '{print $2}' oder cut -f2
Suchen awk '/pattern/' oder grep pattern
Ersetzen sed 's/alt/neu/'
Rechnen awk '{sum+=$1}'

Siehe auch