Lektionen des Moduls (2/4)
Apache-Log-Parser
Apache-Logs (kombiniertes Format) haben eine präzise Struktur:
127.0.0.1 - - [10/Oct/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1234Ein Muster mit benannten Gruppen extrahiert jedes Feld in einem Durchlauf:
^(?<ip>\d+\.\d+\.\d+\.\d+)\s+\S+\s+\S+\s+\[[^\]]+\]\s+"(?<metodo>\w+)\s+(?<path>\S+)\s+\S+"\s+(?<status>\d+)\s+(?<size>\d+)Es sieht monströs aus, ist aber die Verkettung einfacher Muster:
(?<ip>\d+\.\d+\.\d+\.\d+)-- die Quell-IPv4.\s+\S+\s+\S+-- die Benutzer-IDs (normalerweise-).\[[^\]]+\]-- das Datum in eckigen Klammern."(?<metodo>\w+)\s+(?<path>\S+)\s+\S+"-- die Anfrage in Anführungszeichen, mit HTTP-Methode, Pfad und Version.(?<status>\d+)\s+(?<size>\d+)-- Statuscode und gesendete Bytes.
Allgemeine Strategie
- Gehe von der realen Zeile aus und fixiere die Begrenzer: Leerzeichen, Anführungszeichen, eckige Klammern.
- Identifiziere zwischen den Begrenzern den Typ des Tokens (IP, Wort, Zahl).
- Schließe nur in benannte Gruppen ein, was du extrahieren musst.
Parsen komplexer Logs
Beim Parsen von Logs sind Felder normalerweise durch Leerzeichen getrennt, es sei denn, sie enthalten Strings in Anführungszeichen oder eckigen Klammern (z. B. den User-Agent). Die Verwendung von ausschließenden Zeichenklassen anstelle des Punkt-Wildcards verhindert, dass mehrere Spalten fälschlicherweise zusammengeführt werden.
Probiere es aus
Extrahiere die IPv4 am Anfang jeder Logzeile als benannte Gruppe `ip`.
Hinweis anzeigen
Verankere am Anfang der Zeile mit ^ und dem m-Flag und schließe die IP in (?<ip>...) ein.
Lösung nach 3 Versuchen verfügbar
Wiederholungsübung
Extrahiere die HTTP-Methode und den Pfad der Anfrage in Anführungszeichen als Gruppen `metodo` und `path`.
Hinweis anzeigen
Öffne mit ", dann (?<metodo>\w+)\s+(?<path>\S+).
Lösung nach 3 Versuchen verfügbar
Zusätzliche Herausforderung
Extrahiere nur den in eckigen Klammern eingeschlossenen Datums- und Uhrzeitanteil in Logs, z. B. `10/Oct/2024:13:55:36 +0000`, als benannte Gruppe `timestamp`.
Hinweis anzeigen
Verwende \[(?<timestamp>[^\]]+)\], um zu verhindern, dass die Engine über die schließende eckige Klammer hinaus matcht.
Lösung nach 3 Versuchen verfügbar