Ausdrucke per User

rostblock

Jamba
Registriert
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?
 

kauan

Stina Lohmann
Registriert
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
 

rostblock

Jamba
Registriert
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.
 

kauan

Stina Lohmann
Registriert
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
 

rostblock

Jamba
Registriert
22.10.04
Beiträge
54
funtzt!

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

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
dankeschön...
aber was das 'tr' macht hab ich leider immer noch nicht verstanden
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
 

kauan

Stina Lohmann
Registriert
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..
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Rastafari, weisst du eine gescheitere Loesung fuer die Sache mit for/Zeile anstelle von for/"Wort"? Bin da schon mehrmals druebergestolpert..
Äää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?
 

kauan

Stina Lohmann
Registriert
31.12.05
Beiträge
1.043
Äää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?
Genau das
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
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