On Thu, 25 Oct 2001, Marc SCHAEFER wrote:
> tail -f fichier | grep quelque_chose
J'ai oubli� de dire que si l'on redirige, il n'y aura pas buffering
ligne-�-ligne, mais avec un plus grand buffer (p.ex. 512 bytes ou plus, je
n'ai pas en t�te).
Tout cela c'est la biblioth�que C standard: si stdout est un tty
(terminal), buffering par d�faut ligne, sinon `block'. Cf man setvbuf(3)
pour le faire en C.
Exemple:
xterm_1% cat > abcd
xterm_2% tail -f /tmp/abcd | grep turlututu > fichier # mode block!
xterm_3% tail -f fichier
A voir, grep, sauf si connect� � un terminal, fait du buffering plus que
ligne-�-ligne. C'est un comportement qui ne *correspond* pas au
comportement usuel des programmes sous UNIX, qui ne buff�risent pas quand
ils sont face � un pipe, probablement pour optimisation: la preuve c'est
que le tail, lui, passe les donn�es:
schaefer@defian:~% ps auxw | grep grep
schaefer 3670 0.0 0.3 1112 428 pts/7 S 16:22 0:00 grep turlututu
schaefer@defian:~% strace -p 3670
read(0, "abcd\n", 32768) = 5
read(0, "turlututu\n", 32768) = 10
read(0, "turlututu\n", 32768) = 10
[ tail passe, grep buff�rise ]
Sympt�me: seulement si on tape �norm�ment dans xterm_1 on a la sortie dans
xterm_3, avec un BUF_SIZE de d�calage.
Solution:
forcer `grep' � changer le buffering, ie passer � ligne-�-ligne, ou
`no buffering'.
Je l'avoue, je ne sais pas faire, m�me apr�s un grep rapide dans le manuel
et le info. Et je n'ai pas le temps de RTFS aujourd'hui. Par contre, avec
Perl, si, je sais faire, et comme Perl est un excellent grep:
#! /usr/bin/perl -w
use strict;
$| = 1; # no buffering
while (<>) {
if (/turlututu/) {
print;
}
}
Le seul changement � apporter:
xterm_2% tail -f /tmp/abcd | ./machin.pl > /tmp/fichier
Je te laisse soin de modifier le programme pour que la regexp soit
passable par argument.
--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se d�sabonner aussi.