Anzeige:
Ergebnis 1 bis 5 von 5

Thema: cups page_log auslesen

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.08.2007
    Beiträge
    14

    cups page_log auslesen

    hallo,

    ich habe bereits mehrfach angefangen etwas zu schreiben, was die page_log von cups ausliest. leider klappt das alles nicht so, wie es soll.

    es gibt auf einem rechner lokale nutzer und nutzer die aus dem netzwerk aus drucken. Für die die es nicht wissen erstellt cups unter bestimmten vorraussetzungen eine log mit allen druckaufträgen. der aufbau ist folgendermassen:
    druckername lokaler_nutzer jobID datum seitennummer kopien - IP

    - druckername: ist klar
    - lokaler_nutzer: wenn ein lokaler nutzer druckt ist es der account name guest wenn es ein netzwerkdruck ist
    - jobID: halt die fortlaufende zahl des druckauftrages
    datum: klar
    - seite: für jede seite eines druckauftrages wird eine seite gedruckt. jede seite gibt eine zeile in der log. bei 5 seiten also 5 log einträge, die sich nur in der seitennummer erhöhen (wichtig für nacher)
    - wenn ich im druckdialog 5 kopien angeben erscheint das hier
    - die ip von wo der auftrag herkommt. von lokalen user halt "localhost"

    so jetzt will ich wissen wieviel jeder lokale user und netzwerkuser gedruckt hat.

    erstmal hole ich mir die page_log. aufgrund eines logrotating sind diese im gz format.
    also erstmal in ein arbeitsverzeichniss schieben und per
    Code:
    gunzip *
    entpacken, dann mittels
    Code:
    cat page_log* >> druckdaten
    zusammen in einer dateifassen.
    Dann habe ich mittels
    Code:
    cat druckdaten | awk '{print $2,$3,$6*$7,$9}' > druckdaten2
    die datei was bereinigt, der druckername, das datum und - wurde entfernt. gleichzeitig wurde die anzahl der kopien mit der seitenzahl multipliziert.

    Das heisst meien Datei sieht folgendermassen aus.
    lokaler_nutzer jobID Anzahl_Seiten IP

    zu beachten: da ich die dateien mit cat zusammenfasse habe ich blöcke deren JobIDs in sich ansteigen, dies gilt aber nicht für die gesamte datei.

    was mir jetzt noch fehlt, ist die aussortierung des datensatzes mit der maximalen seitenzahl innerhalb derselben jobid-blöcke. da wurde mir bereits hier geholfen hier aber da werde ich nicht schlau draus.
    dann muss ich die seitenzahlen der lokalen user und der ip user zusammenfassen und ausgeben.



    ich beiss mir da die zähne dran aus und hoffe auf eure hilfe.
    wenn ihr einen anderen ansatz habt, lasst euren ergüssen freien lauf.

    aber allein schon danke wenn ihr das hier alles lest

    wolfgang

  2. #2
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von herates Beitrag anzeigen
    ...
    Dann habe ich mittels
    Code:
    cat druckdaten | awk '{print $2,$3,$6*$7,$9}' > druckdaten2
    die datei was bereinigt, der druckername, das datum und - wurde entfernt. gleichzeitig wurde die anzahl der kopien mit der seitenzahl multipliziert.

    Das heisst meien Datei sieht folgendermassen aus.
    lokaler_nutzer jobID Anzahl_Seiten IP

    zu beachten: da ich die dateien mit cat zusammenfasse habe ich blöcke deren JobIDs in sich ansteigen, dies gilt aber nicht für die gesamte datei.

    was mir jetzt noch fehlt, ist die aussortierung des datensatzes mit der maximalen seitenzahl innerhalb derselben jobid-blöcke. da wurde mir bereits hier geholfen hier aber da werde ich nicht schlau draus.
    dann muss ich die seitenzahlen der lokalen user und der ip user zusammenfassen und ausgeben...
    Die Seitenzahlen der lokalen / ip User gesamt oder für jeden Einzelnen? Und so schwer war der awk doch nun auch nicht

    Also, ich versuche mal zusammenzufassen:
    1. Du hast in der Datei druckdaten eine wilde Mischung aus Usern und Job-IDs
    2. lokale Benutzer werden durch die User-ID (für remote-User immer "guest"), IP-User durch die IP-Adresse (für lokale Benutzer immer "localhost") identifiziert
    3. Du willst nach wie vor für jeden Job eine Ausgabe der maximalen Seitennummer = Seitenanzahl
    4. ??? Du willst zusätzlich pro User eine Summe des Druckaufkommens (Seiten * Kopien)
    5. ??? Du willst zusätzlich eine Summe für alle lokalen und alle IP-User

    OK, dann erweitern wir das Ganze mal.

    Zuerst würde ich die Reihenfolge der Felder für die weitere Bearbeitung ändern. Wenn man Gruppenwechsel (also User-ID oder IP) identifizieren will, dann sollte die Eingangsdatei auch nach diesen Kriterien sortiert werden:
    Code:
    awk '{print $2,$9,$3,$6*$7;}' druckdaten | sort | awk -f prt_max_page.awk
    Als Ausgabe hast Du eine zuerst nach User, dann IP und dann Job sortierte Liste. Die wird jetzt dem auswertenden Script übergeben.

    Dazu habe ich das awk-Script entspr. erweitert (und gleich einen kleinen Bug mit der unnötigen chg-Variablen entfernt ;-):
    Code:
    BEGIN { # Initialisierung der benutzten Variablen
            user = "";  # speichert den User-Namen fuer Vergleiche
            ip   = "";  # speichert die IP-Adresse
            job  = 0;   # speichert die Job-ID
            page = 0;   # max. Seitenanzahl / Job
            lcnt = 0;   # Seiten lokaler User
            rcnt = 0;   # Seiten von IP-Usern
          }
    # hier beginnt die Verarbeitung der Zeilen
    { # 1. Zeile: Erstbefuellung der Variablen
      if (user == "") {
        user = $1;
        ip   = $2;
        job  = $3;
        page = $4;
        # Array Seiten / User fuer ersten initialisieren
        if (user == "guest")
          ucnt[ip] = 0;
        else
          ucnt[user] = 0;
      }
      # in aktueller Zeile aendert sich user oder ip: neuer User
      if (user != "" && (user != $1 || ip != $2)) {
        # letzten Job ausgeben
        print user, ip, job, page;
        # Seiten / User fuer letzten User addieren
        if (user == "guest") {
          ucnt[ip] += page;
          rcnt     += page;
        }
        else {
          ucnt[user] += page;
          lcnt       += page;
        }
        # Variablen auf aktuellen Satz setzen
        user = $1;
        ip   = $2;
        job  = $3;
        page = $4;
        # Seitenzahlen / User fuer naechsten User initialisieren
        if (user == "guest")
          ucnt[ip] = 0;
        else
          ucnt[user] = 0;
      }
      # gleicher User, gleiche IP,  neuer Job
      if (user == $1 && ip == $2 && job != $3) {
        # Job ausgeben
        print user, ip, job, page;
        # Seitenanzahl aktueller User addieren
        if (user == "guest") {
          ucnt[ip] += page;
          rcnt     += page;
        }
        else {
          ucnt[user] += page;
          lcnt       += page;
        }
        # Variablen auf aktuellen Satz setzen
        job  = $3;
        page = $4;
      }
      # gleicher User, gleiche IP, gleicher Job: Seitenanzahl pruefen
      if (user == $1 && ip == $2 && job == $3) {
        if (page < $4) page = $4;
      }
    }
    END { # diese Operationen werden nach der letzten Zeile durchgefuehrt
      # letzte Daten drucken
      print user, ip, job, page;
      # letzte Seiten addieren
      if (user == "guest") {
        ucnt[ip] += page;
        rcnt     += page;
      }
      else {
        ucnt[user] += page;
        lcnt       += page;
      }
      # Summen der einzelnen Benutzer ausgeben
      for (user in ucnt) {
        print "Summe ", user, ": ", ucnt[user], " Seiten";
      }
      print "Summe lokale Benutzer: ", lcnt, " Seiten";
      print "Summe remote Benutzer: ", rcnt, " Seiten";
    }
    Das awk-Script liest die per STDIN (aus der Pipe) übergebenen Daten zeilenweise ein. Außerdem gibt es einen BEGIN- und einen END-Block:

    Der BEGIN-Block wird vor dem Lesen der 1. Zeile ausgeführt, hier initialisiere ich die weiter unten benutzten Variablen (ist im awk eigentlich nicht nötig - sie werden bei der Erstbenutzung initialisiert, ich finde es aber übersichtlicher).

    Dann kommt die Bearbeitung der 1. Zeile, wenn die Variable user noch nicht gefüllt ist (könnte man auch mit der internen Variablen NR erkennen): Hier werden alle Variablen auf die Werte der 1. Zeile gesetzt ($1 ... $4 sind die Felder user, ip, job, seiten aus der Eingabe) sowie ein assoziatives Array (Hash) für die Summe der Seiten des Benutzers initialisiert. Es wird zwischen lokalen und remote-Benutzern unterschieden, da bei ersteren der Username und bei letzteren die IP maßgeblich ist.

    Der nächste Abschnitt: Wenn sich entweder der User oder die IP geändert hat, dann haben wir einen neuen User. Dann wird die Zeile mit den letzten Job-Daten des vorigen Benutzers (gespeichert in den Variablen user, ip, job, page) ausgegeben, die Anzahl der Seiten des letzten Jobs zu den Summen des Users addiert und die Variablen auf die Werte der aktuellen Zeile gesetzt (nächster User).

    Wenn sich der Job, aber nicht user und ip geändert haben, dann wird der letzte Job des Users ausgegeben, die Seiten des letzten Jobs zur Summe im Array addiert und job sowie page auf die Werte der aktuellen Eingabezeile gesetzt.

    Ändert sich weder user noch ip noch job, dann wird überprüft, ob die Seitenzahl der aktuellen Zeile höher ist als die bisher in page gespeicherte Maximalzahl für diesen Job und wenn ja übernommen.

    Im END-Abschnitt (der nach der Auswertung der letzten Zeile ausgeführt wird) wird der letzte Job ausgegeben und die Seiten des letzten Jobs auf die des Users addiert. Dann wird in einer For-Schleife über das ucnt-Array die Summe der Seiten / Benutzer ausgegeben und zum Schluss noch die Summen der lokalen und remote-Benutzer.

    Jan

    P.S.: Wenn Du irgendwas im Code nicht verstehst, dann frage bitte einfach nach (ich setze voraus, dass Du Dich mit den genutzten Kommandos - speziell awk - auseinandergesetzt hast).
    Geändert von jan61 (07-09-2007 um 21:34 Uhr) Grund: Schreibfehler

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.08.2007
    Beiträge
    14
    P.S.: Wenn Du irgendwas im Code nicht verstehst, dann frage bitte einfach nach (ich setze voraus, dass Du Dich mit den genutzten Kommandos - speziell awk - auseinandergesetzt hast).
    naja vielleicht war das mti dem nicht draus schlau werden etwas übertrieben. ich konnte es einigermassen nachvollziehen.
    da mein "projekt" nicht nur daraus besteht, habe ich mal allgemein eine anfrage gestellt. ABER ich habe ja auf deine lösung verwiesen

    also eigentlich stimmt das so, aber irgendwo hakt es noch.

    letztendlich will ich wissen, wieveiele seiten ein lokaler nutzer und wieviele seiten ein ip-nutzer gedruckt hat.


    aber irgendwie funktioniert, das script nicht und alle meine versuche scheitern. prinzipiell verstehe ich es ja.

    anbei nochmal dein script, der guest-account hat sich nämlich aus haus3 geändert. das habe ich berenigt. und anbei die testlot mit der ich arbeite...


    auf jeden fall danke für deine hilfe und die zeit die du mir opferst

  4. #4
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von herates Beitrag anzeigen
    ...aber irgendwie funktioniert, das script nicht und alle meine versuche scheitern. prinzipiell verstehe ich es ja.

    anbei nochmal dein script, der guest-account hat sich nämlich aus haus3 geändert. das habe ich berenigt. und anbei die testlot mit der ich arbeite...
    Komisch. Ich habe Deine Attachments runtergeladen und einfach mal laufen lassen:
    Code:
    jan@jack:~/tmp/cups_test> awk '{print $2,$9,$3,$6*$7;}' log.txt | sort | awk -f del.awk.txt
    haus3 134.130.59.61 156 9
    haus3 134.130.59.61 157 1
    haus3 134.130.59.61 160 8
    haus3 134.130.59.63 153 1
    haus3 134.130.59.66 148 2
    haus3 134.130.59.67 152 2
    haus3 134.130.59.75 154 2
    haus3 134.130.59.80 147 1
    haus3 134.130.59.80 151 2
    haus3 134.130.59.80 155 5
    haus3 134.130.59.80 158 1
    haus3 134.130.59.80 159 1
    zi3101 localhost 146 10
    zi3101 localhost 149 14
    zi3108 localhost 150 2
    ----------------------------------------
    Summe  134.130.59.61 :  18  Seiten
    Summe  134.130.59.80 :  10  Seiten
    Summe  134.130.59.63 :  1  Seiten
    Summe  zi3101 :  24  Seiten
    Summe  134.130.59.75 :  2  Seiten
    Summe  134.130.59.66 :  2  Seiten
    Summe  134.130.59.67 :  2  Seiten
    Summe  zi3108 :  2  Seiten
    ----------------------------------------
    Summe lokale Benutzer:  26  Seiten
    Summe remote Benutzer:  35  Seiten
    Kriegst Du Fehlermeldungen? Was funktioniert denn bei Dir nicht, beschreib das doch mal genauer.

    Jan

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.08.2007
    Beiträge
    14
    mmh... ich hatte die zahlen mit den zahlen verglichen die ich manuell aus der log errechnet habe, anscheinend habe ich mich verzählt.

    auf jeden fall danke ich die herzlichst für deine hilfe. wenn ich mal zeit finde muss ich mal awk lernen

    danke danke

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •