peterlein: Reulärer Ausdruck gesucht°!

Ich möchte eine LogDatei auswerten, d. h. ihre einzelnen Elemente in Variablen schreiben. Die Logdatei hat das Format:
Datum Leerzeichen Uhrzeit Leerzeichen Rechner Leerzeichen user ...usw.
Wie kann ich die einzelnen werte in einzelne Variablen schreiben?

Danke für Eure Hilfe!

Peterlein

  1. Hi,

    Du musst zuerst die Logdatei zeilenweise einlesen und dann die Funktion split auf jede Zeile anwenden:
    ($datum, $uhrzeit, $rechner) = split(/ /, $_);

    Der Inhalt der Zeile muss dabei natürlich in $_ stehen.
    Damit werden in die von Leerzeichen getrennten Felder in die 3 Skalare geschrieben.

    Grüße,
    Crunch

    1. Moin,

      Du musst zuerst die Logdatei zeilenweise einlesen und dann die Funktion split auf jede Zeile anwenden:
      ($datum, $uhrzeit, $rechner) = split(/ /, $_);

      das geht (TIMTOWTDI) natuerlich auch schneller und huebscher ;)

      while (<FILE>) {
        chomp;
        my ($datum, $uhrzeit, $rechner) = split; # siehe perldoc -f split [1]
      }

      Viele Gruesse,

      n.d.p.

      [1] http://www.perldoc.com/perl5.6/pod/func/split.html
      Kurzfassung des relevanten Teils:

      'split;' ohne Argumente ist gleich

      split ' ' => $_;

      ' ' (ein space) ist ein spezieller Match auf /\s+/, der schneller ist und obendrein fuehrende spaces noch entfernt etc.

      1. Auch Moin!

        das geht (TIMTOWTDI) natuerlich auch schneller und huebscher ;)

        Das mag wohl sein, doch setzt das alles voraus, dass die Werte selbst keine Leerzeichen enthalten. Falls es sich bei Peterleins Logfiles um Standard-Logs eines Webservers handelt, ist das aber keineswegs gegeben. Das nur als Hinweis.

        So long

  2. Hallo!

    Zum Thema Einlesen haben nd und Crunch Dir bereits geantwortet.

    Datum Leerzeichen Uhrzeit Leerzeichen Rechner Leerzeichen user ...usw.

    Ich bezweifle hier aber genauso wie Calocybe, dass Leerzeichen als Separator geeignet sind. Ich hatte bei meinem Counter (der eigene Logfiles schreibt, etwa nach Deinem Muster) sogar mit dem Stern (*) als Separator Probleme, da dieser schon mal als String in Hostnamen, in Browserkennungen (User-Agent) und sogar innerhalb von URLs vorgekommen ist (vor allem bei den Sessions-ID von Web.de).

    Da half nur vor dem Schreiben in die Logdatei:
     $Host =~ s/\/-/g;
     $Browser =~ s/\
    /-/g; und
     $Referer =~ s/\*/-/g;

    Vielleicht kannst Du aber nach einem ähnlichen Muster die Leerzeichen, die innerhalb der Strings vorkommen, durch beispielsweise Underscores (_) ersetzen.

    Patrick
    <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>