Logs sind oft „laut“: Kommentare, Debug-Zeilen, lange Timestamps. Mit sed kannst du sie schnell bereinigen, vereinheitlichen oder Massen-Ersetzungen durchführen (z. B. IPs anonymisieren) – sogar über viele Dateien hinweg.
🔹 Schnellbereinigung einzelner Dateien
- Kommentare (beginnend mit
#
) entfernensed '/^#/d' app.log > app.clean.log
- Leere Zeilen entfernen
sed '/^[[:space:]]*$/d' app.log > app.clean.log
- Timestamps abschneiden (Beispiel:
YYYY-MM-DD HH:MM:SS
am Zeilenanfang)sed 's/^[0-9-]\{10\} [0-9:]\{8\} //' app.log > app.notime.log
- Level normalisieren (
INFO
→HINWEIS
)sed 's/\bINFO\b/HINWEIS/g' app.log > app.norm.log
Tipp: Erst ohne
-i
(in-place) arbeiten und in neue Dateien schreiben – so siehst du das Ergebnis risikofrei.
🔹 Sicher in-place ändern (mit Backup)
Wenn das Ergebnis passt, kannst du direkt in der Datei ersetzen – mit Backup:
sed -i.bak 's/OLD/IP_NEU/g' access.log # erzeugt: access.log.bak
macOS/BSD:
-i ''
(ohne Backup) oder-i .bak
(mit Suffix) nutzen.
GNU/Linux:-i
erlaubt optionales Suffix wie oben.
🔹 In vielen Logdateien gleichzeitig ersetzen
Variante A: Globbing (ein Ordner)
sed -i.bak 's/203\.0\.113\.42/ANON_IP/g' /var/log/apache2/*.log
Variante B: Rekursiv mit find
Nur reguläre Dateien mit Endung .log
:
find /var/log -type f -name "*.log" -exec sed -i.bak 's/203\.0\.113\.42/ANON_IP/g' {} +
Das
+
hängt viele Dateien an einensed
-Aufruf an (performant).
Punkt in IPs escapen:\.
matcht einen echten Punkt, nicht „beliebiges Zeichen“.
Variante C: Mit xargs
(falls du gezielt aus einer Trefferliste arbeiten
willst)Erst Dateien mit dem Wort/IP finden, dann nur dort ersetzen:
grep -rl --exclude='*.bak' '203\.0\.113\.42' /var/log \ | xargs sed -i.bak 's/203\.0\.113\.42/ANON_IP/g'
grep -r
→ rekursiv-l
→ nur Dateinamen--exclude
→ Backups/Rotations ausschließen
Variante D: Rotierte Logs berücksichtigen
Nur unkomprimierte Logs (ohne .gz
) bearbeiten:
find /var/log -type f -name "*.log" ! -name "*.gz" -exec sed -i.bak 's/foo/bar/g' {} +
Komprimierte Logs vorher entpacken oder mit zgrep/zcat
arbeiten (lesen/prüfen), danach wieder packen.
🔹 Dry-Run & Sicherheit (empfohlen!)
- Nur Treffer zählen (lohnt sich die Aktion überhaupt?):
grep -Rnc --include="*.log" '203\.0\.113\.42' /var/log
- Vorschau der Ersetzungen an einer Datei:
sed 's/203\.0\.113\.42/ANON_IP/g' access.log | head
- Diff vor/nachher (bei In-Place mit Backup):
sed -i.bak 's/203\.0\.113\.42/ANON_IP/g' access.log diff -u access.log.bak access.log | less
- Rechte bedenken: Viele Logs sind Root-geschützt → Befehle ggf. mit sudo ausführen.
🔹 Typische Bereinigungsrezepte für Logs
- Nur ERROR/WARN behalten:
sed -n '/ERROR\|WARN/p' app.log > app.errors.log
- Zeitstempel eckige Klammern entfernen:
[2025-09-24 12:34:56]
sed 's/^\[[^]]*\] //' app.log > app.no_brackets.log
- IP-Adressen anonymisieren (IPv4 generisch):
sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3}/ANON_IP/g' access.log > access.anon.log
- Pfadpräfix kürzen (z. B. lange Root-Pfadanteile):
sed 's|/var/www/html||g' access.log > access.short.log
🔹 Bonus: Kombi mit awk/sort/uniq
nach der Bereinigung
Beispiel: IPs anonymisieren und häufigste Pfade zählen:
sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3}/ANON_IP/g' access.log \ | awk '{print $7}' \ | sort | uniq -c | sort -nr | head
🔹 Übungen
1. Mehrdatei-Ersetzung (Dry-Run → Live):
- Finde alle Logs unter
/var/log
, dieERROR
enthalten.grep -Rli --include="*.log" 'ERROR' /var/log
- Ersetze
ERROR
→FEHLER
in genau diesen Dateien mit Backup.
2. IP-Anonymisierung im Apache-Ordner:
- Ersetze
203.0.113.42
durchANON_IP
in allen*.log
unter/var/log/apache2
. - Prüfe per
diff
, was sich geändert hat.
3. Cleanup-Skript schreiben:
- Lege log_
cleanup.sed
an, das - leere Zeilen löscht,
- Timestamps entfernt,
DEBUG
-Zeilen löscht.
Wende es rekursiv auf/var/log/myapp/
an (mit Backups).
✅ Zusammenfassung
sed
eignet sich perfekt, um Logs zu bereinigen oder massiv zu ändern (z. B. IP-Anonymisierung) – auch über viele Dateien.- Für viele Dateien:
sed -i.bak
mitfind … -exec … +
odergrep -rl … | xargs sed -i.bak …
ist der Standard-Workflow. - Sicherheit: Immer mit Dry-Run, Backups und ggf.
diff
arbeiten. - Rotationen/Kompression beachten (
*.gz
ausschließen oder entpacken).
👉 Im nächsten Kapitel (4) analysieren wir bereinigte Logs mit awk
: Statuscodes zählen, IP-Toplisten, Spitzenzeiten pro Stunde – alles direkt im Terminal. Möchtest du, dass ich Kapitel 4 gleich schreibe?
📚 Inhaltsverzeichnis
👉 Log-Analyse Kapitel 1: Logs im Terminal lesen – cat, less, tail & grep
👉 Log-Analyse Kapitel 2: Filtern mit grep und regulären Ausdrücken
👉 Log-Analyse Kapitel 3: Logs bereinigen mit sed – inkl. Mehrdatei-Änderungen
👉 Log-Analyse Kapitel 4: Logs analysieren mit awk
👉 Log-Analyse Kapitel 5: Logs kombinieren mit grep, sed, awk, sort, uniq & cut
👉 Log-Analyse Kapitel 6: Praxisprojekt – Apache-/Nginx-Access-Logs analysieren
👉 Log-Analyse Kapitel 7: Praxisprojekt – Systemlogs analysieren (auth.log & journalctl)
⭐ Bonus-Kapitel
👉 Log-Analyse Kapitel 8 (Bonus): Eigene Auswertungs-Skripte für Logs schreiben
👉 Log-Analyse Kapitel 9 (Bonus): Logs visualisieren mit CSV & gnuplot