Hallo Leute. Ich dachte bisher, ich würde verstehen, was grep tut. Tue ich aber nicht. Folgende Fälle: tail -f /datei # wirft die Änderungen an der Datei aus tail -f /datei | cat # Tut dasselbe tail -f /datei | grep -v bla # wirft die Änderungen ohne bla aus tail -f /datei | grep -v bla | cat # wirft nichts aus Warum? -- Andre Tann
Hallo, Am Mit, 25 Okt 2006, Andre Tann schrieb:
Ich dachte bisher, ich würde verstehen, was grep tut. Tue ich aber nicht.
Folgende Fälle:
tail -f /datei # wirft die Änderungen an der Datei aus tail -f /datei | cat # Tut dasselbe tail -f /datei | grep -v bla # wirft die Änderungen ohne bla aus tail -f /datei | grep -v bla | cat # wirft nichts aus
Warum?
Buffered I/O. Schreib ein bisserl mehr (4 KB sollten reichen) in /datei. -dnh -- If Windows is the solution, can we please have the problem back?
David Haller, Mittwoch, 25. Oktober 2006 22:03:
Buffered I/O.
Schreib ein bisserl mehr (4 KB sollten reichen) in /datei.
Kann man das abschalten? Ich kann nicht mehr in die Datei schreiben, als kommt. Und mit der aktuellen Geschwindigkeit würde es ca. einen Tag dauern, bis die 4 kB voll sind. Ich würde aber gerne sofort sehen, was grep zu sagen hat. -- Andre Tann
Am Mittwoch, 25. Oktober 2006 22:59 schrieb Andre Tann:
David Haller, Mittwoch, 25. Oktober 2006 22:03:
Buffered I/O.
Schreib ein bisserl mehr (4 KB sollten reichen) in /datei.
Kann man das abschalten? Ich kann nicht mehr in die Datei schreiben, als kommt. Und mit der aktuellen Geschwindigkeit würde es ca. einen Tag dauern, bis die 4 kB voll sind. Ich würde aber gerne sofort sehen, was grep zu sagen hat.
da kommt mir folgende Idee: tail f- /datei | while read line do ... hier mit expr den Ausdruck filtern ... und dann etwas machen done ich nehme ja mal an, daß das letzte cat in der Pipe nicht ein "cat" ist sondern etwas anderes (sinnvolleres). Diese Programm dann in der while-Schliefe mit einer Zeile als Eingabe aufrufen. Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
On Wednesday 25 October 2006 22:03, David Haller wrote:
Ich dachte bisher, ich würde verstehen, was grep tut. Tue ich aber nicht.
Folgende Fälle:
tail -f /datei # wirft die Änderungen an der Datei aus tail -f /datei | cat # Tut dasselbe tail -f /datei | grep -v bla # wirft die Änderungen ohne bla aus tail -f /datei | grep -v bla | cat # wirft nichts aus
Warum?
Buffered I/O.
Schreib ein bisserl mehr (4 KB sollten reichen) in /datei.
oder grep --line-buffered Torsten
Hallo, Am Don, 26 Okt 2006, Andre Tann schrieb:
Torsten Foertsch, Donnerstag, 26. Oktober 2006 09:46:
oder grep --line-buffered
Ah, wieder was gelernt. Jetzt tut es so, wie ich es wollte.
Der Vollstaendigkeit halber: $ grep --line-bufferd grep: unrecognized option `--line-bufferd' $ grep --version grep (GNU grep) 2.2 Auch andere grep Varianten kennen diese Option nicht. Siehe: http://www.opengroup.org/onlinepubs/007908799/xcu/grep.html Grep's, die diese (oder analoge) Option kennen gibt es z.B. erst ab: SuSE Linux 8.1 Redhat Linux 7.3 OpenBSD 3.6 FreeBSD 5.3 NetBSD 2.0 Darwin 8.0.1 Auch in der aktuellen Version kennen folgende die Option nicht: HP-UX 11.22 SunOS 5.9 (aka Solaris nochwas) Siehe: http://www.freebsd.org/cgi/man.cgi?query=grep -dnh -- Ich bin mir zu Unsicher um sicher zu sein. [WoKo in dag°]
Guten Tag David Haller, am Donnerstag, 26. Oktober 2006 um 11:50 schrieben Sie:
Hallo,
Am Don, 26 Okt 2006, Andre Tann schrieb:
Torsten Foertsch, Donnerstag, 26. Oktober 2006 09:46:
oder grep --line-buffered
Ah, wieder was gelernt. Jetzt tut es so, wie ich es wollte.
Der Vollstaendigkeit halber:
$ grep --line-bufferd grep: unrecognized option `--line-bufferd' $ grep --version grep (GNU grep) 2.2
Auch andere grep Varianten kennen diese Option nicht. Siehe: http://www.opengroup.org/onlinepubs/007908799/xcu/grep.html
Grep's, die diese (oder analoge) Option kennen gibt es z.B. erst ab:
SuSE Linux 8.1 Redhat Linux 7.3 OpenBSD 3.6 FreeBSD 5.3 NetBSD 2.0 Darwin 8.0.1
Auch in der aktuellen Version kennen folgende die Option nicht: HP-UX 11.22 SunOS 5.9 (aka Solaris nochwas)
Guten Morgen ;) grep --line-buffered Flush output on every line. Note that this incurs a performance penalty. Text stammt von dem Link oben. Da fehlt ein "e" bei bufferd .
-dnh
-- Ich bin mir zu Unsicher um sicher zu sein. [WoKo in dag°]
-- Mit freundlichen Grüßen Sebastian Gödecke mailto:sgoedecke@gmx.net
Hallo, Am Don, 26 Okt 2006, Sebastian Gödecke schrieb:
am Donnerstag, 26. Oktober 2006 um 11:50 schrieben Sie:
$ grep --line-bufferd grep: unrecognized option `--line-bufferd' $ grep --version grep (GNU grep) 2.2 [..] Guten Morgen ;) grep --line-buffered Flush output on every line. Note that this incurs a performance penalty. Text stammt von dem Link oben. Da fehlt ein "e" bei bufferd .
Macht aber keinen Unterschied: $ grep --line-buffered grep: unrecognized option `--line-buffered' Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more information. $ grep --version grep (GNU grep) 2.2 -dnh -- So wie yast2 [auf der Konsole] zur Zeit aussieht, ist es das Outlook unter den Konsolenprogrammen: Nämlich die alleinseligmachende, fortgesetzte Normverletzung unter Vorgabe guter Motive. -- "ratti" in suse-linux
On Thursday 26 October 2006 14:08, David Haller wrote:
$ grep --line-buffered grep: unrecognized option `--line-buffered' Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more information. $ grep --version grep (GNU grep) 2.2
$ grep --help Usage: grep [OPTION]... PATTERN [FILE] ... Search for PATTERN in each FILE or standard input. Example: grep -i 'hello world' menu.h main.c Regexp selection and interpretation: ... Miscellaneous: ... Output control: -m, --max-count=NUM stop after NUM matches -b, --byte-offset print the byte offset with output lines -n, --line-number print line number with output lines --line-buffered flush output on every line ... $ grep -V grep (GNU grep) 2.5.1 Torsten
Hi, Am Donnerstag, 26. Oktober 2006 14:08 schrieb David Haller:
Hallo,
Am Don, 26 Okt 2006, Sebastian Gödecke schrieb:
am Donnerstag, 26. Oktober 2006 um 11:50 schrieben Sie:
$ grep --line-bufferd grep: unrecognized option `--line-bufferd' $ grep --version grep (GNU grep) 2.2
[..]
Guten Morgen ;) grep --line-buffered Flush output on every line. Note that this incurs a performance penalty. Text stammt von dem Link oben. Da fehlt ein "e" bei bufferd .
Macht aber keinen Unterschied:
$ grep --line-buffered grep: unrecognized option `--line-buffered' Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more information. $ grep --version grep (GNU grep) 2.2
Die Option ist erst mit 2.5.x reingekommen siehe hier: http://www.linux.com/article.pl?sid=06/05/19/1920231 Gruß, Dennis Sieben
Dennis Sieben wrote:
$ grep --line-buffered grep: unrecognized option `--line-buffered' Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more information. $ grep --version grep (GNU grep) 2.2
Die Option ist erst mit 2.5.x reingekommen siehe hier: http://www.linux.com/article.pl?sid=06/05/19/1920231
Sollte nicht so kritisch sein. Selbst auf meiner fast abgelaufenen Version Suse 9.2 ist schon die Version 2.5.1 installiert. Es gibt nur wenige alte Server, die "gehallert" werden. (^-^) Sandy -- Antworten bitte nur in die Mailingliste! PMs bitte an: news-reply2 (@) japantest (.) homelinux (.) com
Hallo, Am Don, 26 Okt 2006, Sandy Drobic schrieb:
Dennis Sieben wrote:
$ grep --line-buffered grep: unrecognized option `--line-buffered' Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more information. $ grep --version grep (GNU grep) 2.2
Die Option ist erst mit 2.5.x reingekommen siehe hier: http://www.linux.com/article.pl?sid=06/05/19/1920231
Sollte nicht so kritisch sein. Selbst auf meiner fast abgelaufenen Version Suse 9.2 ist schon die Version 2.5.1 installiert. Es gibt nur wenige alte Server, die "gehallert" werden. (^-^)
*gnurfl* Ich schrieb doch schon in meiner ersten Mail, dass ein entsprechendes GNU grep bei SuSEn ab Version 8.1 dabei ist. Mein Punkt war: diese (und andere) Option ist nicht standardisiert, und ist nicht bei jedem grep vorhanden. Teilweise selbst auf aktuellen Unix-Systemen nicht. Und soo alt ist z.B. FreeBSD 5.3 vom 2004/11/03 noch nicht. -dnh -- booting wetware is a critical process - it affects the systems mood
On Thursday 26 October 2006 16:40, David Haller wrote:
Mein Punkt war: diese (und andere) Option ist nicht standardisiert, und ist nicht bei jedem grep vorhanden. Teilweise selbst auf aktuellen Unix-Systemen nicht.
In dem Fall kann man nach der Option des gerade verfügbaren Grep zum Abschalten des gepufferten Schreibens fahnden. Falls es diese nicht gibt, kann man immer noch ein Pseudoterminal dafür benutzen. Kein Grep puffert den Output, wenn er auf ein Terminal schreibt. Das Ganze erfordert ein paar Zeilen Perl- oder C-Code. Das Perl-Modul IPC::Run kann dabei vielleicht helfen. Vielleicht gibt es sowas auch irgendwo in den Weiten des Internet schon fertig. Torsten
Hallo, Am Fre, 27 Okt 2006, Torsten Foertsch schrieb:
On Thursday 26 October 2006 16:40, David Haller wrote:
Mein Punkt war: diese (und andere) Option ist nicht standardisiert, und ist nicht bei jedem grep vorhanden. Teilweise selbst auf aktuellen Unix-Systemen nicht.
In dem Fall kann man nach der Option des gerade verfügbaren Grep zum Abschalten des gepufferten Schreibens fahnden. Falls es diese nicht gibt, kann man immer noch ein Pseudoterminal dafür benutzen. Kein Grep puffert den Output, wenn er auf ein Terminal schreibt. Das Ganze erfordert ein paar Zeilen Perl- oder C-Code. Das Perl-Modul IPC::Run kann dabei vielleicht helfen. Vielleicht gibt es sowas auch irgendwo in den Weiten des Internet schon fertig.
==== mklinebuffered.c ====
#include
Hallo David, On Friday 27 October 2006 13:19, David Haller wrote:
Am Fre, 27 Okt 2006, Torsten Foertsch schrieb:
On Thursday 26 October 2006 16:40, David Haller wrote:
Mein Punkt war: diese (und andere) Option ist nicht standardisiert, und ist nicht bei jedem grep vorhanden. Teilweise selbst auf aktuellen Unix-Systemen nicht.
In dem Fall kann man nach der Option des gerade verfügbaren Grep zum Abschalten des gepufferten Schreibens fahnden. Falls es diese nicht gibt, kann man immer noch ein Pseudoterminal dafür benutzen. Kein Grep puffert den Output, wenn er auf ein Terminal schreibt. Das Ganze erfordert ein paar Zeilen Perl- oder C-Code. Das Perl-Modul IPC::Run kann dabei vielleicht helfen. Vielleicht gibt es sowas auch irgendwo in den Weiten des Internet schon fertig.
==== mklinebuffered.c ==== #include
#include #ifndef BUFSIZ # define BUFSIZ 8192 #endif int main(void) { char buf[BUFSIZ+1]; while( fgets( (char*)&buf, BUFSIZ, stdin) == buf ) { if( fputs( (char*)&buf, stdout) == EOF ) { perror(""); exit(errno); } if( fflush(stdout) != 0 ) { perror(""); exit(errno); } } return 0; } ====
$ make mklinebuffered $ ./mklinebufferd < ./FIFO | grep test
Das scheint zu funktionieren, solange das Programm, das nach ./FIFO schreibt nach seinen Ausgaben den Buffer "flushed".
Beispielsweise:
$ perl -e '$|=1;while(<>) { print $_;};' > ./FIFO
Zu beenden mit Strg+d.
Bei dem grep Problem geht es nicht darum, daß das Programm, das in den grep schreibt, puffert, sondern der grep selbst. Viele UNIX Programme puffern ihren Output solange sie nicht auf ein Terminal schreiben, so auch grep. Wie schon gesagt, kennen neuere greps die Option --line-buffered. Damit schreibt der grep jede Zeile extra. Für alte greps gibt es nur die Option, den Output über ein Pseudoterminal zu leiten. Nur so kann man ihm das Puffern abgewöhnen. In Perl geht das so: tailf file | perl -MPOSIX -MIO::Pty -e ' $|=1; my $pty=IO::Pty->new; $pty->autoflush(1); my $pid=fork; if($pid) { $pty->close_slave; while(defined($_=<$pty>)) {print} } else { POSIX::dup2($pty->slave->fileno, 1); close $pty->slave; close $pty; exec @ARGV; }' grep 1 | cat Jede Zeile, die nun in file erscheint und einen 1 enthält, wird sofort an cat weitergeleitet. Damit verhält sich diese Pipe genau wie tailf file | grep 1 Anders verhält sich tailf file | grep 1 | cat Hier puffert grep seinen Output, da er in eine Pipe und nicht auf ein Terminal schreibt. Erst wenn dieser Puffer voll ist, also nach einigen kByte, sieht cat Input. Ich hoffe, jetzt ist es etwas klarer, was ich meinte. Es gibt übrigens das Programm "unbuffer". Das macht genau das selbe; nur ist es kompiliert. tailf file | unbuffer -p grep 1 | cat Torsten
Hallo, Am Fre, 27 Okt 2006, Torsten Foertsch schrieb:
On Friday 27 October 2006 13:19, David Haller wrote:
==== mklinebuffered.c ==== [..] *BLUBB*
Das war natuerlich nix.
Es gibt übrigens das Programm "unbuffer". Das macht genau das selbe; nur ist es kompiliert.
tailf file | unbuffer -p grep 1 | cat
Ok, das klappt (mit Dateien). -dnh -- Windows is too dangerous to be left to Windows admins. -- James Riden
Was grep da tut, ist ja nun geklärt. Aber falls du eine sich ändernde Datei bei gleichzeitiger Filterung beobachten möchtest, hätte ich vielleicht was für dich. Ist ein wenig aus dem Zusammenhang gerissen, du kannst es dir erstmal allenfalls ansehen. Aufruf tailmsg <RE> <Datei> Da ich das für die syslog-Messages gemacht habe, ist /var/log/messages Default, tailmsg named zeigt an, was der Nameserver so treibt, sofern das im Syslog ankommt... -- Viele Grüße ------------------------------------------------------------------------ Michael
Am Mittwoch, 25. Oktober 2006 21:54 schrieb Andre Tann:
Hallo Leute.
Ich dachte bisher, ich würde verstehen, was grep tut. Tue ich aber nicht.
Folgende Fälle:
tail -f /datei # wirft die Änderungen an der Datei aus tail -f /datei | cat # Tut dasselbe tail -f /datei | grep -v bla # wirft die Änderungen ohne bla aus tail -f /datei | grep -v bla | cat # wirft nichts aus
Blick in die Glaskugel: lange genug gewartet? Da die Ausgaben gepuffert werden kann es eben passieren, daß wenn die Daten von tail -f nicht "schnell" genug kommen, bzw. grep zu "wenig" Daten (pro Zeiteinheit) liefert, dann wartet cat halt eine Zeitlang. Wenn man tail durch cat ersetzt was passiert dann? Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Dr. Jürgen Vollmer, Donnerstag, 26. Oktober 2006 08:19:
Blick in die Glaskugel:
lange genug gewartet?
Ja. Ne halbe Stunde oder so.
Da die Ausgaben gepuffert werden kann es eben passieren, daß wenn die Daten von tail -f nicht "schnell" genug kommen, bzw. grep zu "wenig" Daten (pro Zeiteinheit) liefert, dann wartet cat halt eine Zeitlang.
tail liefert mir alle Viertelstunde eine Zeile mit ein paar Buchstaben drin. Mehr kommt da nicht.
Wenn man tail durch cat ersetzt was passiert dann?
Dann funktionierts sofort. Offenbar kann cat signalisieren, daß es jetzt fertig ist. Und dann schieben auch grep & co sofort ihre Ausgabe hinterher. -- Andre Tann
Am Donnerstag, 26. Oktober 2006 09:02 schrieb Andre Tann:
Dr. Jürgen Vollmer, Donnerstag, 26. Oktober 2006 08:19:
Blick in die Glaskugel:
lange genug gewartet?
Ja. Ne halbe Stunde oder so.
Da die Ausgaben gepuffert werden kann es eben passieren, daß wenn die Daten von tail -f nicht "schnell" genug kommen, bzw. grep zu "wenig" Daten (pro Zeiteinheit) liefert, dann wartet cat halt eine Zeitlang.
tail liefert mir alle Viertelstunde eine Zeile mit ein paar Buchstaben drin. Mehr kommt da nicht.
Wenn man tail durch cat ersetzt was passiert dann?
Dann funktionierts sofort. Offenbar kann cat signalisieren, daß es jetzt fertig ist.
logisch, denn dann wird ja stdout geschlossen, und der nächste Prozess liest ja über stdin und bekommt mit daß eof erreicht wurde, und "erledigt" dann seine restlichen Aufgaben, beendet sich und das bekommt der nächste in der Pipe mit usw.
Und dann schieben auch grep & co sofort ihre Ausgabe hinterher.
Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
participants (8)
-
Andre Tann
-
David Haller
-
Dennis Sieben
-
Dr. Jürgen Vollmer
-
Michael Behrens
-
Sandy Drobic
-
Sebastian Gödecke
-
Torsten Foertsch