258 lines
4.9 KiB
Markdown
258 lines
4.9 KiB
Markdown
# 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<min) min=$1} END {print min}' zahlen.txt
|
|
```
|
|
|
|
## Formatierte Ausgabe
|
|
|
|
### Mit printf
|
|
|
|
```bash
|
|
awk '{printf "%s: %d\n", $1, $2}' datei.txt
|
|
awk '{printf "%-10s %5d\n", $1, $2}' datei.txt # Formatiert
|
|
```
|
|
|
|
### Spalten ausrichten
|
|
|
|
```bash
|
|
awk '{printf "%-15s %10s\n", $1, $2}' datei.txt
|
|
```
|
|
|
|
## Eingebaute Variablen
|
|
|
|
```bash
|
|
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
|
|
|
|
```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
|