il trap: Mustererkennung

Hallo,

Ich habe Logfiles, die ich auswerten will. Sie sind so aufgebaut:

[Sep 26 2002, 16:42:23]

Eventbeschreibung

[Sep 26 2002, 16:44:28]

Ich habe eine Lösung, um [Sep 26 2002, 16:42:23] auszuwerten, so:

if (/[(\S+) (\S+) (\S+), (\S+)]/) {
   print "$1 $2 $3 $4\n";
}

Allerdings habe ich keine Ahnung, wie das mit der Eventbeschreibung läuft, also wie ich die auslesen kann. Das ist einfach Text mit allen möglichen Zeichen, der sich über mehrere Zeilen erstreckt. Bis jetzt erkenne ich nur was in [...] steht, weil das ja auch ein konstantes Muster ist.

Schlussendlich wird für jeden Monat des Jahres eine Datei generiert, in der alle Event-Daten und eben die Eventbeschreibung drinstehen (s. oben).

Wäre für Tipps sehr dankbar.

Gruss,
il trap

  1. Hallo,

    Hi,

    Ich habe Logfiles, die ich auswerten will. Sie sind so aufgebaut:

    [Sep 26 2002, 16:42:23]

    Eventbeschreibung

    [Sep 26 2002, 16:44:28]

    verhältnismäßig untypisch für Logfiles, aber naja

    Ich habe eine Lösung, um [Sep 26 2002, 16:42:23] auszuwerten, so:

    if (/[(\S+) (\S+) (\S+), (\S+)]/) {
       print "$1 $2 $3 $4\n";
    }

    Naja, finde ich nicht sonderlich brilliant ;)

    Allerdings habe ich keine Ahnung, wie das mit der Eventbeschreibung läuft, also wie ich die auslesen kann. Das ist einfach Text mit allen möglichen Zeichen, der sich über mehrere Zeilen erstreckt. Bis jetzt erkenne ich nur was in [...] steht, weil das ja auch ein konstantes Muster ist.

    Schlussendlich wird für jeden Monat des Jahres eine Datei generiert, in der alle Event-Daten und eben die Eventbeschreibung drinstehen (s. oben).

    Im Grunde kannst du die gesamte Datei in einen Skalar einlesen:

    my $content = do { local $/; <$filehandle> };

    und dann alles so auswerten:

    while( $content =~ m{
             [
                ( \w+ ) #month
                \s+
                ( \d{2} ) #day
                \s+
                ( \d{4} ) #year
                ,\s+
                ( \d{2} : \d{2} : \d{2} ) #time
             ]
             ( #capture event-description
               (?:
                  [^\n]       #no newline
                | \n (?! [ ) #or newline NOT followed by [
               )+
              )
          }x ){

    print "Am $2ten $1 im Jahre $3, um $4 Uhr, passierte: $5\n";
    }

    HTH

    1. Hi,

      Im Grunde kannst du die gesamte Datei in einen Skalar einlesen:

      WAAAAAH!!!!1

      Diese Empfehlung möchtest Du bitte noch mal überdenken ... :-)

      Cheatah

      --
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
  2. Hi,

    [Sep 26 2002, 16:42:23]
    Eventbeschreibung

    mehrzeilig? Blöd ...

    if (/[(\S+) (\S+) (\S+), (\S+)]/) {

    Escape bitte das "]" noch.

    Allerdings habe ich keine Ahnung, wie das mit der Eventbeschreibung läuft, also wie ich die auslesen kann.

    Lies einfach die Datei weiter, bis Du auf eine Datumsangabe oder das Dateiende stößt.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes