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.

Répondre à