Andreas Jud: Perl: Graphische auswertung und satz splitten

Hallo...

Wieder einmal hab ich ein mehr oder weniges schwierieges Problem...

Zuerst das auswerten einer logdatei... kennt jemand ein einfach zu konfigurierendes Statistik Programm ??

Die Log Datei sieht folgender massen aus:

Datum       Zeit        ;; Anz. User

Thu Mar 11 00:15:11 1999;;11
Thu Mar 11 00:16:11 1999;;11
Thu Mar 11 00:17:11 1999;;11
Thu Mar 11 00:18:11 1999;;12

Diese am Besten auf einem Gif ausgeben (Tagesstatistik)
Am besten ohne zusätzliches Perl-Modul!

Mein zweites Problem ist folgendes:

Ich hab eine Variable die in ca. Folgendes enthält:

"befehl user und einen text"

Nun will ich diesen in 3 Variablen aufteilen:

$befehl = "befehl";        # Befehl, immer der gleiche
$user   = "user";          # Username, immer klein
$text   = "und ein text";  # Rest, länge umbestimmt

Hmm.. das ist im moment alles!

Vielen Dank für Eure lösungen !

MfG

Andreas Jud

  1. Hallo...

    Ich hab eine Variable die in ca. Folgendes enthält:
    "befehl user und einen text"
    Nun will ich diesen in 3 Variablen aufteilen:

    $befehl = "befehl";        # Befehl, immer der gleiche
    $user   = "user";          # Username, immer klein
    $text   = "und ein text";  # Rest, länge umbestimmt

    Die Gegebenheiten, die Du in den Kommentaren geschrieben hast, uebergehe ich mal, weil ich vermute, das es einfacher geht: Ich nehme einfach an, zwischen Befehl und User sowie zwischen User und Rest steht jeweils ein Leerzeichen. Weitere Leerzeichen in Rest sind egal. Dann also:

    ($befehl, $user, $text) = split(' ', "befehl user und einen text", 3)

    Reicht das oder muss es wirklich so kompliziert sein, wie Du geschrieben hast?

    Calocybe

    1. Hi,

      ($befehl, $user, $text) = split(' ', "befehl user und einen text", 3)

      lieber mit ($befehl, $user, @textarray) und anschließendem $text = join(' ',@textarray); sonst wird evtl. nur das erste Wort des Textes gewertet.

      Was das andere Problem betrifft: So 'ne Logfileauswertung ist nicht schwer zu programmieren. Die Grafikausgabe wirst Du aber wohl kaum ohne Modul schaffen - ich bin auch dran verzweifelt, das GIF-Format zu verstehen... installiere GD.pm, falls das noch nicht auf dem Server ist!

      Cheatah

      1. Hi,

        ($befehl, $user, $text) = split(' ', "befehl user und einen text", 3);
        lieber mit ($befehl, $user, @textarray) und anschließendem $text = join(' ',@textarray); sonst wird evtl. nur das erste Wort des Textes gewertet.

        Wieso? Warst es nicht Du selbst, der mir mal diesen Tip mal gegeben hatte? Die 3 bestimmt die Maximalanzahl der Felder, in die gesplittet wird. Auch wenn es noch oefter gesplittet werden koennte, wird der ganze Rest in $text gepackt. Steht sogar so in meiner Perl-Doku:
        ($login, $passwd, $remainder) = split(/:/, $_, 3);

        Es ist aber besser, / +/ als pattern zu verwenden, wie Thomas es geschrieben hat.

        Calocybe

        1. Hi,

          Wieso? Warst es nicht Du selbst, der mir mal diesen Tip mal gegeben hatte? Die 3 bestimmt die Maximalanzahl der Felder, in die gesplittet wird. Auch wenn es noch oefter gesplittet werden koennte, wird der ganze Rest in $text gepackt. Steht sogar so in meiner Perl-Doku:
          ($login, $passwd, $remainder) = split(/:/, $_, 3);

          oh, sorry - die "3" hatte ich überlesen! Ich nehme alles zurück und behaupte das Gegenteil :-)

          Cheatah

          P.S.: Von mir stammt der Tip aber bestimmt nicht, ich lese das jetzt zum ersten mal... die Anwendung erscheint mir aber logisch!

  2. Hi Andreas,
    Ich denke ich kann dir weiterhelfen. Ich habe zum Auswerten des Server-Logs meiner Webseite ein vergleichbares Script geschrieben.

    Zum 1.
    Um eine Statistik als Balkengrafik darzustellen gibt es eine ganz einfache Lösung. Erstelle ein GIF-Bild von 16x16 Punkten mit der Farbe die die Balken haben sollen und lade es auf deinen Server.

    Wenn du die Statistik ausgibst erstelle eine HTML-Tabelle mit unsichtbaren Rahmen und sovielen Zellen wie du Werte ausgeben willst. z.B. 31 Zellen nebeneinander für die Tage eines Monats. Verwende VALIGN=BOTTOM zur Ausrichtung. In jeder Zelle zeigst du das Bild mit <IMG SRC=/IMAGES/DOT.GIF WIDTH=16 HEIGHT=$height ALT=$value> an. (Hoffentlich filtert das Forum dieses tag nicht :)
    $value ist der einzelne Wert, $height die Höhe in pixel.

    Um herauszufinden wie hoch das Bild werden soll mußt du zuerst den höchsten Wert in der Liste finden. Ich mach das mit:
    $max=1
    foreach (@values)
    {
      if ($max<$_) {$max=$_}
    }

    Als nächstes mußt du das Verhältniss von Wert/Pixel definieren.
    z.B. '$dot=150 / $max' für 150 Pixel.
    Der Wert von $height ist also 'int($value*$dot)'. Verwende Int um die Kommastellen zu entfernen.

    Wenn du die einzelnen Balken untereinander ausgibts kannst du auf Tabellen verzichten und <br> Tags verwenden.

    Zum 2.
    Das ist schnell erklärt, Um existierende strings in Arrays zu zerlegen ist Split() die richtige wahl.
    split(/ +/,$string) zerlegt einen String in einzelne Elemente. / +/ bedeutet das ein oder mehrere Leerzeichen als Seperator gelten.

    Die ganze Routine sähe ungefähr so aus:

    foreach $line (@log)
    {
      ($command,$user,$text)=split(/ +/,$line);
      ...
    }

    Du kannst anstelle des linken ausdrucks auf ein Array angeben.

    Das wars,
    CU Thomas

    1. Hi Andreas,
      Ich denke ich kann dir weiterhelfen. Ich habe zum Auswerten des Server-Logs meiner Webseite ein vergleichbares Script geschrieben.

      Zum 1.
      Um eine Statistik als Balkengrafik darzustellen gibt es eine ganz einfache Lösung. Erstelle ein GIF-Bild von 16x16 Punkten mit der Farbe die die Balken haben sollen und lade es auf deinen Server.

      Wenn du die Statistik ausgibst erstelle eine HTML-Tabelle mit unsichtbaren Rahmen und sovielen Zellen wie du Werte ausgeben willst. z.B. 31 Zellen nebeneinander für die Tage eines Monats. Verwende VALIGN=BOTTOM zur Ausrichtung. In jeder Zelle zeigst du das Bild mit <IMG SRC=/IMAGES/DOT.GIF WIDTH=16 HEIGHT=$height ALT=$value> an. (Hoffentlich filtert das Forum dieses tag nicht :)
      $value ist der einzelne Wert, $height die Höhe in pixel.

      Um herauszufinden wie hoch das Bild werden soll mußt du zuerst den höchsten Wert in der Liste finden. Ich mach das mit:
      $max=1
      foreach (@values)
      {
        if ($max<$_) {$max=$_}
      }

      Als nächstes mußt du das Verhältniss von Wert/Pixel definieren.
      z.B. '$dot=150 / $max' für 150 Pixel.
      Der Wert von $height ist also 'int($value*$dot)'. Verwende Int um die Kommastellen zu entfernen.

      Wenn du die einzelnen Balken untereinander ausgibts kannst du auf Tabellen verzichten und

      »»  Tags verwenden.

      Hmm.. merci für den Tip, ist eine überlegeung wert !

      Zum 2.
      Das ist schnell erklärt, Um existierende strings in Arrays zu zerlegen ist Split() die richtige wahl.
      split(/ +/,$string) zerlegt einen String in einzelne Elemente. / +/ bedeutet das ein oder mehrere Leerzeichen als Seperator gelten.

      Die ganze Routine sähe ungefähr so aus:

      foreach $line (@log)
      {
        ($command,$user,$text)=split(/ +/,$line);
        ...
      }

      Du kannst anstelle des linken ausdrucks auf ein Array angeben.

      Das wars,
      CU Thomas

      Hmm.. sowas hatte ich, ging aber nicht !

      Es muss so ausehen:

      ($command,$user,$text)=split(/ +/,$line,3);

      Dann funkts !

      Mit nem Array hatte es auch nicht funktioniert !

      MfG

      Andy