# awk - Textverarbeitung und Datenextraktion `awk` ist eine mächtige Programmiersprache für Textverarbeitung, besonders nützlich für spaltenbasierte Daten. ## Grundsyntax ```bash awk 'MUSTER { AKTION }' datei.txt ``` ## Spalten ausgeben ### Einzelne Spalten ```bash 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 ```bash awk '{print $1, $3}' datei.txt awk '{print $1 " - " $3}' datei.txt ``` ## Trennzeichen (Delimiter) ### Standard (Leerzeichen/Tab) ```bash awk '{print $1}' datei.txt ``` ### Eigenes Trennzeichen ```bash awk -F: '{print $1}' /etc/passwd # Doppelpunkt awk -F, '{print $1, $3}' datei.csv # Komma awk -F'|' '{print $2}' datei.txt # Pipe ``` ### Mehrere Trennzeichen ```bash awk -F'[,:]' '{print $1}' datei.txt ``` ## Muster (Pattern) ### Zeilen mit bestimmtem Text ```bash awk '/ERROR/ {print}' logfile.txt awk '/ERROR/' logfile.txt # Kurzform ``` ### Reguläre Ausdrücke ```bash awk '/^[0-9]/ {print}' datei.txt # Zeilen mit Zahl am Anfang awk '/ERROR|WARNING/' logfile.txt # ERROR oder WARNING ``` ### Spaltenbasierte Bedingungen ```bash 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 ```bash awk '$3 > 100 && $4 < 200 {print}' datei.txt awk '$1 == "Alice" || $1 == "Bob" {print}' datei.txt ``` ## Berechnungen ### Summe ```bash awk '{sum += $1} END {print sum}' zahlen.txt ``` ### Durchschnitt ```bash awk '{sum += $1; count++} END {print sum/count}' zahlen.txt ``` ### Maximum/Minimum ```bash awk 'BEGIN {max=0} {if($1>max) max=$1} END {print max}' zahlen.txt awk 'NR==1 {min=$1} {if($1=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 ```bash awk 'BEGIN {print "Start"} {print} END {print "Ende"}' datei.txt ``` ```bash awk 'BEGIN {FS=":"; OFS="\t"} {print $1, $3}' /etc/passwd ``` ## Praktische Beispiele ### /etc/passwd auswerten ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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 ```bash awk '{count[$1]++} END {for(key in count) print key, count[key]}' datei.txt ``` ## Arrays ```bash awk '{arr[$1] += $2} END {for (key in arr) print key, arr[key]}' datei.txt ``` ## Mehrere Dateien ```bash awk '{print FILENAME, $0}' datei1.txt datei2.txt ``` ## Mit Pipes ```bash cat datei.txt | awk '{print $1}' ls -l | awk '{print $9, $5}' df -h | awk 'NR>1 {print $1, $5}' ``` ## Komplexes Beispiel ```bash # 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 - [[IT-Know-How/Linux/BASH Basics/grep]] - Textsuche - [[IT-Know-How/Linux/BASH Basics/sed]] - Stream-Editor - [[IT-Know-How/Linux/BASH Basics/find]] - Dateien finden - [[IT-Know-How/Linux/BASH Basics/BASH Funktionen]] - awk in Funktionen nutzen - [[IT-Know-How/Linux/BASH Basics/ls]] - Ausgabe mit awk verarbeiten