1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Ausdrucke per User

Dieses Thema im Forum "macOS & OS X Server" wurde erstellt von rostblock, 07.01.08.

  1. rostblock

    rostblock Jamba

    Dabei seit:
    22.10.04
    Beiträge:
    54
    würde gern eine Anzahl der gedruckten Seiten pro User ausgeben

    for u in *; do
    grep -i $u /var/log/cups/page_log
    done
    wirft ne nette Liste aus. (Wobei man in dem Ordner sein sollte der die Usernames enthält)
    Jetzt würde ich gern nur die ausgeben wollen wo die Kombi Username-PID ein andere ist und davon die letzte Zeile.
    Also statt:
    _10_0_5_1 str 352 [07/Jan/2008:15:40:14 +0100] 1 1 - localhost
    _10_0_5_1 str 352 [07/Jan/2008:15:40:14 +0100] 2 1 - localhost
    _10_0_5_1 str 352 [07/Jan/2008:15:40:15 +0100] 3 1 - localhost
    _10_0_5_1 str 352 [07/Jan/2008:15:40:15 +0100] 4 1 - localhost
    _10_0_5_1 str 352 [07/Jan/2008:15:40:15 +0100] 5 1 - localhost
    AV_HP str 353 [07/Jan/2008:15:49:40 +0100] 1 1 - localhost
    AV_HP str 353 [07/Jan/2008:15:49:40 +0100] 2 1 - localhost
    AV_HP str 353 [07/Jan/2008:15:49:40 +0100] 3 1 - localhost
    AV_HP str 353 [07/Jan/2008:15:49:41 +0100] 4 1 - localhost
    AV_HP str 353 [07/Jan/2008:15:49:41 +0100] 5 1 - localhost

    soll nur
    _10_0_5_1 str 352 [07/Jan/2008:15:40:15 +0100] 5 1 - localhost
    AV_HP str 353 [07/Jan/2008:15:49:41 +0100] 5 1 - localhost
    da bleiben.
    Hat jemand ne gute Idee?
     
  2. kauan

    kauan Stina Lohmann

    Dabei seit:
    31.12.05
    Beiträge:
    1.043
    Hab dir hier eine Loesung -- ist unschoen aber geht.


    Code:
    file=/var/log/cups/page_log
    for id in `awk '{print $2 ";" $3}' $file | sort | uniq`; do
        grep "`echo $id | tr ';' ' '`" $file | head -1
    done
    Erstmal nur das zweite und dritte "Wort" des Files ausgeben, diese Ausgabe sortieren und davon jede Zeile nur einmal ausgeben.
    Durch diese Liste gehen und den Eintrag grepen.

    Der Teil mit dem Semikolon ist nicht schoen, aber ich weiss keinen anderen Weg, um for dazu zu zwingen, Leerzeichen nicht als Trennzeichen zu betrachten.
    Ebenso ist der grep-Teil nicht fehlerfrei, da koennten falsche Dinge gefunden werden.

    Aber hey, es geht immerhin ;)

    gruss
    Jonathan
     
  3. rostblock

    rostblock Jamba

    Dabei seit:
    22.10.04
    Beiträge:
    54
    1.000 Dank

    funktioniert soweit. Allerdings scheint der erste Eintrag genommen zu werden.
    Wenn 5 Seiten im Cups gedruckt werden, steht im log
    SW_A3 str 1021 [19/Dec/2007:14:16:14 +0100] 1 1 - 10.0.5.201
    SW_A3 str 1021 [19/Dec/2007:14:16:14 +0100] 2 1 - 10.0.5.201
    SW_A3 str 1021 [19/Dec/2007:14:16:14 +0100] 3 1 - 10.0.5.201
    SW_A3 str 1021 [19/Dec/2007:14:16:15 +0100] 4 1 - 10.0.5.201
    SW_A3 str 1021 [19/Dec/2007:14:16:15 +0100] 5 1 - 10.0.5.201

    es soll aber nur die letzte Zeile mit der Seitenanzahl rauskommen
    SW_A3 str 1021 [19/Dec/2007:14:16:15 +0100] 5 1 - 10.0.5.201

    Kannst Du mir bitte den Befehl erklären?
    grep "`echo $id | tr ';' ' '`" $file | head -1
    dann krieg ich's vielleicht allein hin.
     
  4. kauan

    kauan Stina Lohmann

    Dabei seit:
    31.12.05
    Beiträge:
    1.043
    Achso, ja da hab ich mich verlesen. Dann nimm tail statt head
    Das komplette Script ohne Fehler also:
    Code:
    file=/var/log/cups/page_log
    for id in `awk '{print $2 ";" $3}' $file | sort | uniq`; do
        grep "`echo $id | tr ';' ' '`" $file | [B]tail[/B] -1
    done
    
    Erklaerung:
    Code:
    echo $id               # str;1021
    echo $id | tr ';' ' '  # str 1021
    grep ... $file         # aus dem file nur oben genannten Inhalt ausgeben
    grep ... | tail -1     # Von dieser Ausgabe nur die letzte Zeile (bzw tail -3 letzte 3 Zeilen usw) ausgeben (head -1 = erste statt letzte)
    gruss
    Jonathan
     
  5. rostblock

    rostblock Jamba

    Dabei seit:
    22.10.04
    Beiträge:
    54
    funtzt!

    dankeschön...
    aber was das 'tr' macht hab ich leider immer noch nicht verstanden
     
  6. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.898
    tr ist ein Filter, der bestimmte Zeichen oder Zeichenfolgen entfernen oder durch andere ersetzen kann. Für sowas kann man auch ed oder sed verwenden. Oder awk oder oder oder...
    tr ist nur etwas simpler und flotter.
    Wie wärs mal mit:
    Code:
    man tr
    
     
  7. kauan

    kauan Stina Lohmann

    Dabei seit:
    31.12.05
    Beiträge:
    1.043
    Rastafari, weisst du eine gescheitere Loesung fuer die Sache mit for/Zeile anstelle von for/"Wort"? Bin da schon mehrmals druebergestolpert..
     
  8. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.898
    Äääh. Ägypten????
    Meinst du eine "for item in ... do" Schleife mit jeweils einer einzelnen ganzen Zeile als Parameter übergeben, trotz Whitespace? Also ohne WordSplitting bei enthaltenen Spaces oder Tabs, nur bei Newlines? Oder wie?
     
  9. kauan

    kauan Stina Lohmann

    Dabei seit:
    31.12.05
    Beiträge:
    1.043
    Genau das
     
  10. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.898
    Hmm. Für Dummies? :)
    Code:
    sample_string=\
    "$(
        echo "Das hier ist ein Text,        der       wo"
        echo "totaaaaal      viiiele    Spices, Neuleins"
        echo "und linksdrehende Kommatare enthalten tut."
    )"
    
    
    # normales word splitting 
    
    for a_word in $sample_string
      do 
        echo "$a_word  +++STOP+++"
    done
    
    [COLOR="Blue"]Das  +++STOP+++
    hier  +++STOP+++
    ist  +++STOP+++
    ein  +++STOP+++
    Text,  +++STOP+++
    der  +++STOP+++
    wo  +++STOP+++
    totaaaaal  +++STOP+++
    viiiele  +++STOP+++
    Spices,  +++STOP+++
    Neuleins  +++STOP+++
    [/COLOR]# ...usw
    
    
    # word splitting nur beim newline
    
    IFS=$'\n'
    for a_word in $sample_string
      do 
        unset IFS
        echo "$a_word  +++STOP+++"
    done
    unset IFS
    
    [COLOR="Blue"]Das hier ist ein Text,        der       wo  +++STOP+++
    totaaaaal      viiiele    Spices, Neuleins  +++STOP+++
    und linksdrehende Kommatare enthalten tut.  +++STOP+++[/COLOR]
    
    # IFS --> Internal Field Separator
    # (vordefinierte "special" Shellvariable)
    # bestimmt das Separatorzeichen zum word splitting 
    #  und das  "read"  Shell-builtin-Kommando
    #
    # Standardwert:  $' \t\n'
    # (sprich: Space+Tab+Newline)
    #
    # Ist der IFS ein Nullstring,
    # findet keinerlei Splitting statt
    # Wird der IFS terminiert,
    # wird der Standardwert angenommen
    #
    # Terminieren nicht vergessen
    # und zwar am besten [U]sofort[/U]
    # nachdem es nicht mehr gebraucht wird
    # sowohl als erste Aktion in der Schleife
    # (sonst gilt es dort auch... GRRRRMPFL)
    # aber auch wenn die Schleife gar nicht
    # erst betreten wird (BUG-alarm)
    #
    # Vorsicht:
    # IFS kann fast beliebige und
    # beliebig viele Zeichen annehmen
    # wie jeder andere Bezeichner auch, ABER
    # es gibt gewisse Konflikte
    # u.a. mit den Zeichen,
    # die reservierte Worte der Shell sind
    # zB bei --> { } | & > < \ ;
    # also mit Bedacht einsetzen
    
     

Diese Seite empfehlen