Wichtige Regex-Zeichen
| . | Beliebiges Zeichen |
| ^ | Zeilenanfang |
| $ | Zeilenende |
| * | 0 oder mehr des Vorigen |
| + | 1 oder mehr (ERE: -E) |
| ? | 0 oder 1 (ERE: -E) |
| [abc] | Zeichenklasse |
| [^abc] | Negierte Klasse |
| \b | Wortgrenze |
| \d | Ziffer (PCRE: -P) |
| \w | Wortzeichen (PCRE) |
| {n,m} | n bis m Wiederholungen |
Praxis-Beispiele
# IP-Adressen finden $ grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' log.txt # E-Mail-Adressen $ grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-z]{2,}' # Zeilen die NICHT mit # beginnen $ grep -v '^#' config.txt # Nur Zeilen zwischen zwei Mustern $ sed -n '/START/,/END/p' datei.txt # Rekursiv alle .go Fehler $ grep -rn "error" --include="*.go" .
grep mit Pipeline
# Häufigste IPs im Access-Log $ grep -oE '^[0-9.]+' access.log \ | sort | uniq -c | sort -rn | head -10 # HTTP 5xx Fehler zählen $ grep -cE ' 5[0-9]{2} ' access.log # Zeilen vor+nach Fehler $ grep -B2 -A5 "FATAL" app.log # Git-Log nach Autor filtern $ git log --oneline \ | grep -i "fix"
Substitution & Backreferences
# Gruppen mit \1 referenzieren $ sed 's/\(foo\)\(bar\)/\2\1/' # foobar → barfoo # Datum von YYYY-MM-DD zu DD.MM.YYYY $ sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\3.\2.\1/' # Nur in Zeilen die "error" enthalten $ sed '/error/s/foo/bar/g' # Leerzeichen am Zeilenende trimmen $ sed 's/[[:space:]]*$//' # Kommentarzeilen entfernen + Leere $ sed '/^\s*#/d; /^$/d' config.conf # Zeilennummern voranstellen $ sed '=' datei.txt | sed 'N;s/\n/\t/'
Mehrere Befehle & Skript-Modus
# Mehrere -e Ausdrücke $ sed -e 's/foo/bar/g' -e '/^#/d' # sed-Skript aus Datei $ sed -f transforms.sed input.txt # In allen Dateien eines Ordners $ find . -name "*.go" \ -exec sed -i 's/OldName/NewName/g' {} \; # Zeilen N–M extrahieren (wie head+tail) $ sed -n '10,20p' large.log # HTML-Tags entfernen $ sed 's/<[^>]*>//g' page.html # Windows CRLF → Unix LF $ sed -i 's/\r//' datei.txt
Aufbau & Variablen
awk verarbeitet Eingabe Zeile für Zeile. Jede Zeile wird in Felder aufgeteilt ($1, $2, …, $NF). Spezialvariablen:
| NR | Aktuelle Zeilennummer |
| NF | Anzahl Felder in Zeile |
| FS | Input-Trennzeichen |
| OFS | Output-Trennzeichen |
| RS | Record-Separator (\n) |
| ORS | Output-Record-Sep. |
| FILENAME | Aktueller Dateiname |
| $0 | Komplette Zeile |
Praxis-Beispiele
# CSV: Spalten 1 und 3 ausgeben $ awk -F',' '{print $1","$3}' data.csv # Summe einer Spalte $ awk '{sum+=$2} END{print "Total:", sum}' # Durchschnitt $ awk '{s+=$1} END{print s/NR}' # Duplikate entfernen (Reihenfolge beibehalten) $ awk '!seen[$0]++' datei.txt # Zeilen zwischen zwei Mustern $ awk '/START/{f=1} f; /END/{f=0}' # Felder umsortieren $ awk -F':' 'BEGIN{OFS="\t"} {print $3,$1,$6}' /etc/passwd
Log-Analyse Beispiel
# Nginx: Requests pro Status-Code $ awk '{print $9}' access.log \ | sort | uniq -c | sort -rn # Requests pro Stunde $ awk '{print substr($4,2,14)}' access.log \ | sort | uniq -c # Top 10 langsamste Requests $ awk '{print $NF,$7}' access.log \ | sort -rn | head -10 # Speichernutzung pro Prozess $ ps aux | awk 'NR>1 {mem[$11]+=$6} END {for(p in mem) print mem[p], p}' \ | sort -rn | head -10
Dateien & Text
# Alle TODOs im Projekt mit Datei+Zeile $ grep -rn "TODO" --include="*.go" . \ | sort -t: -k1,1 # Größte Dateien im Home-Ordner $ find ~ -type f -size +50M \ -exec ls -lh {} \; \ | sort -k5rh # Alle leeren Ordner löschen $ find . -type d -empty -delete # Alle .DS_Store rekursiv löschen $ find . -name ".DS_Store" -print0 \ | xargs -0 rm # Dateien parallel komprimieren $ find . -name "*.log" -print0 \ | xargs -0 -P 8 gzip # JSON-API response verarbeiten $ curl -s https://api.example.com/users \ | jq -r '.[].email' \ | sort | uniq
System & Monitoring
# Port offen? Mit Timeout $ timeout 3 bash -c "cat < /dev/tcp/host/80" \ && echo "open" || echo "closed" # Prozess-CPU alle 2s überwachen $ watch -n2 'ps aux | sort -k3rn | head -5' # Log live + nur Fehler $ tail -f app.log | grep --line-buffered "ERROR" # Disk-Wachstum beobachten $ watch -n5 'df -h | grep /dev/sd' # Netzwerk-Traffic per Interface $ cat /proc/net/dev \ | awk 'NR>2 {print $1, "RX:"$2, "TX:"$10}' # SSH: Remote-Ordner mounten $ sshfs user@host:/remote/path ~/mountpoint # Unmount: $ fusermount -u ~/mountpoint