Konsolenausgabe wordcount plus mehr

Hallo zusammen,

Ich versuche schon laenger, meiner Konsole beizubringen, mir neben einem Word Count auch das Datum auszugeben.

Was klappt:
gzcat sys.log.2006* | grep 2006-03-06 | grep Suchwort | wc -l
=> dann bekomme ich eine korrekte Zahl

Ich hätte aber gerne 2006-03-06 -> 99

Folgendes geht nicht:
awk ‚{print "2006-03-06 -> "}‘ | gzcat sys.log.2006* | grep 2006-03-06 | grep Suchwort | wc -l

Das Einschliessen der Greps in den AWK-Befehl hat auch nicht geklappt.

Kann mir da jemand helfen??
Danke schon mal,

Mightbee

Hallo zusammen,

Hi,

gzcat sys.log.2006* | grep 2006-03-06 | grep Suchwort | wc -l

Ich hätte aber gerne 2006-03-06 -> 99

awk ‚{print "2006-03-06 -> "}‘ | gzcat sys.log.2006* | grep 2006-03-06 | grep Suchwort | wc -l

Das Einschliessen der Greps in den AWK-Befehl hat auch nicht
geklappt.

Wie waere

 $ echo -n "2006-03-06 -\> "; gzcat sys.log.2006\* |grep 2006-03-06 |grep Suchwort |wc -l

Oder… also, naja,
Gruss vom Frank.

Hallo,

gzcat sys.log.2006* | grep 2006-03-06 | grep Suchwort | wc -l
=> dann bekomme ich eine korrekte Zahl

Ich hätte aber gerne 2006-03-06 -> 99

Du kannst vorher einfach date ausführen. Mit

date ‚+%Y-%m-%d‘ ; gzcat …
bekommst du in die Zeile davor schonmal das Datum. Wie man das newline am Ende der date-Ausgabe mit unix-Bordmitteln weiss ich nicht genau (ich war noch nie Freund von sed und awk), aber mit perl kann ich dir helfen:

date '+%Y-%m-%d' | perl -ne 'chomp;print $\_, " -\> "'; zgrep 2006-03-06 sys.log.2006\* |grep -c Suchwort

Und wenn du immer nach dem aktuellen Datum suchen willst, kannst du ‚2006-03-06‘ durch $(date ‚+%Y-%m-%d‘) ersetzen.

HTH,
Moritz

date ‚+%Y-%m-%d‘ ; gzcat …
bekommst du in die Zeile davor schonmal das Datum. Wie man das
newline am Ende der date-Ausgabe mit unix-Bordmitteln weiss
ich nicht genau (ich war noch nie Freund von sed und awk),
aber mit perl kann ich dir helfen:

Ohne sed und awk, das kann die Shell alleine:

 $ echo -n `date +%F`

(ist uebrigens synonym zu %Y-%m-%d und die ‚‘ braucht es nicht, muss kein Zeichen escaped werden, und -n ist uebrigens bash, die sh hat da, glaube ich -c, weiss nicht mehr genau, braucht eh keiner…)

Und wenn du immer nach dem aktuellen Datum suchen willst,
kannst du ‚2006-03-06‘ durch $(date ‚+%Y-%m-%d‘) ersetzen.

Wobei auch $() bashism ist, `` kompatibel und more obfuscating… das aber nur am Rande.

Gruss vom Frank.

Wobei auch $() bashism ist, `` kompatibel und more
obfuscating… das aber nur am Rande.

Hallo Frank,

Einspruch:

  1. ksh (und andere) können das auch ( $() und das ganze Zeug wie ${} …)

  2. obfuscating: kann ich nicht behaupten. Vielleicht nur dann, wenn man sich ältere Shellscript-Bücher (aus den 90er und davor) anschaut. Irgendwie ist das Konstrukt Backticks scheinbar nicht totzukriegen (oder es schreiben alle voneinander ab, naja tun wir ja wohl alle :wink:

  3. Spätestens, wenn man versucht mehrere Ausdrücke mit Backticks zu verschachteln, wird landet man in weniger als 2 Stunden in der Klappsmühle. Mit $() alles kein Problem, die Klammerung bildet einen schönen Hierarchiebaum und die Shell kümmert sich um alles.

Ich vermute jedoch aufgrund deines ‚bashism‘-Hinweises, dass ich dir diese Vorteile nicht erklären muss. Ich wollte nur dem Eindruck relativieren, dass $() ein irgendwie komisches Konstrukt ist („kein Standard, läuft ja eh nur bei diesen komischen Freaks^H^H^H^H^H^HLinuxern…“), widersprechen.

gruss
bernhard

Hallo zusammen,
Das ECHO war der Tipp, der mir fehlte. Mit awk schwebte ich wohl schon in höheren Sphären…

Falls es jemanden amüsiert: so sieht mein Komplettstatement jetzt aus:
gzcat sys.log.2006* | grep „Suchwort“ | awk ‚{print $1}‘ | sort | uniq | awk ‚{print "echo -n „“ $1 " -> „; gzcat sys.log.2006* | grep " $1 " | grep Suchwort | wc -l“ }‘ > ~/doit.sh

=> doit.sh ist dann ausführbar und liefert mir Statistiken: Bsp.:
2006-03-10 -> 8
2006-03-11 -> 1
2006-03-13 -> 16
2006-03-14 -> 19

Danke noch mal an alle!!
Mightbee