Servus zusammen, mit folgender Frage komme ich gerade nicht weiter: wie kann man denn live Zeilen zählen? Ich will ein Logfile nach bestimmten Vorkommen überwachen, und dabei einen Zähler sehen, der sich jedesmal erhöht, wenn eine entsprechende Zeile vorbeigekommen ist. grep "Stichwort" $LOGDATEI | wc -l kenne ich, aber da kann ich nicht beim Zählen zugucken. Hat jemand einen Tip? -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Mittwoch, 5. Oktober 2011, 08:47:18 schrieb Andre Tann:
Servus zusammen,
mit folgender Frage komme ich gerade nicht weiter: wie kann man denn live Zeilen zählen? Ich will ein Logfile nach bestimmten Vorkommen überwachen, und dabei einen Zähler sehen, der sich jedesmal erhöht, wenn eine entsprechende Zeile vorbeigekommen ist.
grep "Stichwort" $LOGDATEI | wc -l
kenne ich, aber da kann ich nicht beim Zählen zugucken.
Hat jemand einen Tip?
Vielleicht eine Endlosschleife drumherum und mit sleep jeweils eine Sekunde warten? Jürgen -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Andre, On Wednesday, 05.October.2011 08:47:18 Andre Tann wrote:
Hat jemand einen Tip?
declare -i n=0; tail -f logfile | while read line; do ((n++)); echo $n; done Wenn ich nun date >> logfile ein paarmal aufrufe bekomme ich einen hochlaufenden Zaehler. Roman -- Roman Fietze Telemotive AG Buero Muehlhausen Breitwiesen 73347 Muehlhausen Tel.: +49(0)7335/18493-45 http://www.telemotive.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Roman Fietze, Mittwoch, 5. Oktober 2011:
declare -i n=0; tail -f logfile | while read line; do ((n++)); echo $n; done
So habe ich es nun gelöst. Der Vorschlag von Martin funktioniert zwar, aber bringt a) bei großen Logfiles eine gewisse Last, und b) fängt er nicht bei 1 an zu zählen. Vielen Dank für den Tip! Eine kosmetische Frage noch: wie kann man es denn anstellen, daß die jeweils nächste Zahl immer an dieselbe Stelle geschrieben wird? Ich habe damit experimentiert: …echo -ne "$i\b"… Aber sobald $i zweistellig wird siehts nicht mehr schön aus. Wie gehts richtig? Viele Grüße! -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am Mittwoch 5 Oktober 11 schrieb Andre Tann:
Roman Fietze, Mittwoch, 5. Oktober 2011:
declare -i n=0; tail -f logfile | while read line; do ((n++)); echo $n; done
Eine kosmetische Frage noch: wie kann man es denn anstellen, daß die jeweils nächste Zahl immer an dieselbe Stelle geschrieben wird? Ich habe damit experimentiert:
…echo -ne "$i\b"…
Aber sobald $i zweistellig wird siehts nicht mehr schön aus. Wie gehts richtig?
man echo: ... \b Zeichen zurück ... \r Wagenrücklauf ... …echo -ne "$i\r"… -- Herzliche Grüße! Rolf Muth Meine Adressen duerfen nicht fuer Werbung verwendet werden! PGP Public Key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xF8DC41935544C89A
On Wednesday, 05 October 2011 15:55:26 Andre Tann wrote:
Eine kosmetische Frage noch: wie kann man es denn anstellen, daß die jeweils nächste Zahl immer an dieselbe Stelle geschrieben wird?
for ((i=0; i<2000; i++)); do echo -ne '\rprefix: '$i; usleep 50000; done; echo Torsten Förtsch -- Need professional modperl support? Hire me! (http://foertsch.name) Like fantasy? http://kabatinte.net -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Torsten Förtsch, Mittwoch, 5. Oktober 2011:
for ((i=0; i<2000; i++)); do echo -ne '\rprefix: '$i; usleep 50000; done; echo
Nicht ganz optimal: for ((i=100; i>1; i--)); do echo -ne '\rprefix: '$i; usleep 50000; done; echo Könnte man natürlich jetzt so machen: ...echo -ne '\rprefix: '$i' ' Scheint mir aber etwas unelegant. Geht das besser? -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
On Wed, October 5, 2011 4:29 pm, Andre Tann wrote:
Torsten Förtsch, Mittwoch, 5. Oktober 2011:
for ((i=0; i<2000; i++)); do echo -ne '\rprefix: '$i; usleep 50000; done; echo
Nicht ganz optimal:
for ((i=100; i>1; i--)); do echo -ne '\rprefix: '$i; usleep 50000; done; echo
Könnte man natürlich jetzt so machen:
...echo -ne '\rprefix: '$i' '
Scheint mir aber etwas unelegant. Geht das besser?
Nimm printf(1). Ist eh portabler. Grüße, Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Christian Brabandt, Mittwoch, 5. Oktober 2011:
Nimm printf(1). Ist eh portabler.
Ich habe jetzt: for ((i=100;i>0;i--)); do printf '\r%b ' "$i"; usleep 20000; done; echo Funktioniert, aber auch hier gefällt mir immer noch nicht, daß hinter %b ein paar Leerzeichen eingefügt werden müssen, damit die Zahl richtig erscheint. Gibt es eine Möglichkeit zu sagen: $i schreiben, Rest der Zeile löschen? Das alles ist natürlich schon eher theoretisch, meine ursprüngliche Frage ist schon völlig ausreichen beantwortet. Trotzdem, die Neugier... Warum schreibst Du (1) hinter printf - damit ich "man 1 printf" angucke? Danke+Gruß! -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo Andre, On Thursday, 06.October.2011 09:46:45 Andre Tann wrote:
Ich habe jetzt:
for ((i=100;i>0;i--)); do printf '\r%b ' "$i"; usleep 20000; done; echo
Funktioniert, aber auch hier gefällt mir immer noch nicht, daß hinter %b ein paar Leerzeichen eingefügt werden müssen, damit die Zahl richtig erscheint. Gibt es eine Möglichkeit zu sagen: $i schreiben, Rest der Zeile löschen?
for ((i=100;i>0;i--)); do printf '\r%b\e[K' "$i"; usleep 20000; done; echo Aber das ist so nicht portabel. Und so ist's schon fast ueberall lauffaehig, nur eben langsamer: for ((i=100;i>0;i--)); do printf '\r%b' "$i"; tput el; usleep 20000; done; echo Also noch etwas schneller: el=$(tput el) for ((i=100;i>0;i--)); do printf '\r%b%s' "$i" "$el"; usleep 20000; done; echo Evt. erst mal noch abtesten ob 'tput el' einen Fehler bringt wie unknown terminfo capability.
Warum schreibst Du (1) hinter printf - damit ich "man 1 printf" angucke?
So ist die offizielle Bezeichnung, auch sichtbar im Titel der man page. Roman -- Roman Fietze Telemotive AG Buero Muehlhausen Breitwiesen 73347 Muehlhausen Tel.: +49(0)7335/18493-45 http://www.telemotive.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Thu, 06 Oct 2011, Roman Fietze schrieb:
On Thursday, 06.October.2011 09:46:45 Andre Tann wrote:
Ich habe jetzt:
for ((i=100;i>0;i--)); do printf '\r%b ' "$i"; usleep 20000; done; echo
Funktioniert, aber auch hier gefällt mir immer noch nicht, daß hinter %b ein paar Leerzeichen eingefügt werden müssen, damit die Zahl richtig erscheint. Gibt es eine Möglichkeit zu sagen: $i schreiben, Rest der Zeile löschen?
for ((i=100;i>0;i--)); do printf '\r%b\e[K' "$i"; usleep 20000; done; echo
RTFM ihr beide! Und zwar man 3 printf ==== man 1 printf ==== FORMAT controls the output as in C printf. [..] SEE ALSO printf(3) ==== sowie ==== info coreutils 'printf invocation' ==== `printf' prints the FORMAT string, interpreting `%' directives and `\' escapes to format numeric and string arguments in a way that is mostly similar to the C `printf' function. *Note `printf' format directives: (libc)Output Conversion Syntax, for details. ==== also: info libc 'Output Conversion Syntax' for ((i=100;i>0;i--)); do printf '\r% 3i' "$i"; usleep 20000; done; echo [..]
Warum schreibst Du (1) hinter printf - damit ich "man 1 printf" angucke?
So ist die offizielle Bezeichnung, auch sichtbar im Titel der man page.
Vgl. man 1p printf, man 3 printf, man 3p printf, perldoc -f printf. HTH, -dnh -- Beware of bugs in the above code; I have only proved it correct, not tried it. - Donald Knuth -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
David Haller, Donnerstag, 6. Oktober 2011:
also: info libc 'Output Conversion Syntax'
for ((i=100;i>0;i--)); do printf '\r% 3i' "$i"; usleep 20000; done; echo
Nö. Das bleibt bei mir an Schluß so stehen: === # for ((i=100;i>0;i--)); do printf '\r% 3i' "$i"; usleep 20000; done; echo 10 # === Also zwei Leerzeichen vor der 1, und eine Restnull danach.
Vgl. man 1p printf, man 3 printf, man 3p printf, perldoc -f printf.
Woher weiß man denn, welche Abschnitte es in den manpages gibt? In neueren SuSEs wird das ja jeweils vorher ausgeworfen. Aber würde es das nicht, wie fände man es? -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Thu, 06 Oct 2011, Andre Tann schrieb:
David Haller, Donnerstag, 6. Oktober 2011:
also: info libc 'Output Conversion Syntax'
for ((i=100;i>0;i--)); do printf '\r% 3i' "$i"; usleep 20000; done; echo
Nö. Das bleibt bei mir an Schluß so stehen:
=== # for ((i=100;i>0;i--)); do printf '\r% 3i' "$i"; usleep 20000; done; echo 10 # ===
Also zwei Leerzeichen vor der 1, und eine Restnull danach.
for ((i=100;i>0;i--)); do printf '\r% 4i' "$i"; usleep 20000; done; echo
Vgl. man 1p printf, man 3 printf, man 3p printf, perldoc -f printf.
Woher weiß man denn, welche Abschnitte es in den manpages gibt? In neueren SuSEs wird das ja jeweils vorher ausgeworfen. Aber würde es das nicht, wie fände man es?
apropos printf man -k printf -dnh -- I believe the technical term is "Oops!" -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 05.10.2011 08:47, schrieb Andre Tann:
Servus zusammen,
mit folgender Frage komme ich gerade nicht weiter: wie kann man denn live Zeilen zählen? Ich will ein Logfile nach bestimmten Vorkommen überwachen, und dabei einen Zähler sehen, der sich jedesmal erhöht, wenn eine entsprechende Zeile vorbeigekommen ist.
grep "Stichwort" $LOGDATEI | wc -l
kenne ich, aber da kann ich nicht beim Zählen zugucken.
Hat jemand einen Tip?
Vielleicht: watch -n sekunden grep -c "Stichwort" $LOGDATEI -- Mit freundlichen Grüßen Martin Blank -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (8)
-
Andre Tann
-
Christian Brabandt
-
David Haller
-
Juergen Langowski
-
Martin Blank
-
R M
-
Roman Fietze
-
Torsten Förtsch