Direkt zum Hauptinhalt springen
eLearner.app
Modul 8 · Lektion 2 von 430/32 im Kurs~12 min
Lektionen des Moduls (2/4)

Apache-Log-Parser

Apache-Logs (kombiniertes Format) haben eine präzise Struktur:

Code
127.0.0.1 - - [10/Oct/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1234

Ein Muster mit benannten Gruppen extrahiert jedes Feld in einem Durchlauf:

Code
^(?<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

  1. Gehe von der realen Zeile aus und fixiere die Begrenzer: Leerzeichen, Anführungszeichen, eckige Klammern.
  2. Identifiziere zwischen den Begrenzern den Typ des Tokens (IP, Wort, Zahl).
  3. 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

Übung#regex.m8.l2.e1
Versuche: 0Wird geladen…

Extrahiere die IPv4 am Anfang jeder Logzeile als benannte Gruppe `ip`.

Editor wird geladen…
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

Übung#regex.m8.l2.e2
Versuche: 0Wird geladen…

Extrahiere die HTTP-Methode und den Pfad der Anfrage in Anführungszeichen als Gruppen `metodo` und `path`.

Editor wird geladen…
Hinweis anzeigen

Öffne mit ", dann (?<metodo>\w+)\s+(?<path>\S+).

Lösung nach 3 Versuchen verfügbar

Zusätzliche Herausforderung

Übung#regex.m8.l2.e3
Versuche: 0Wird geladen…

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`.

Editor wird geladen…
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