Que fait la mise en mémoire tampon de la ligne grep?

25

Voici ma commande que j'utilise dans un script pour grepdes données en temps réel. Il ne semble pas tirer correctement les données en temps réel car il manque juste quelques lignes.

tail -f <file> | fgrep "string" | sed 's/stuff//g' >> output.txt

Que ferait la commande suivante? Qu'est-ce que la «mise en mémoire tampon de ligne»?

tail -f <file> | fgrep --line-buffered "string" | sed 's/stuff//g' >> output.txt
Roboman1723
la source

Réponses:

44

Lors de l'utilisation non interactive, la plupart des commandes standard incluent grep, tamponnent la sortie, ce qui signifie qu'elle n'écrit pas les données immédiatement stdout. Il recueille une grande quantité de données (dépend du système d'exploitation, sous Linux, souvent 4096 octets) avant d'écrire.

Dans votre commande, grepla sortie « est canalisé vers stdinde sedcommande, de sorte greptampon sa sortie.

Ainsi, l' --line-bufferedoption provoquant l' greputilisation du tampon de ligne, ce qui signifie l'écriture de la sortie à chaque fois qu'il voit une nouvelle ligne, au lieu d'attendre d'atteindre 4096 octets par défaut. Mais dans ce cas, vous n'avez pas besoin grepdu tout, utilisez simplement tail+ sed:

tail -f <file> | sed '/string/s/stuff//g' >> output.txt

Avec une commande qui n'a pas d'option pour modifier le tampon, vous pouvez utiliser GNU coreutils stdbuf

tail -f <file> | stdbuf -oL fgrep "string" | sed 's/stuff//g' >> output.txt

pour activer la mise en mémoire tampon en ligne ou -o0pour désactiver la mémoire tampon.

Remarque

cuonglm
la source