web-dev-qa-db-fra.com

Que fait grep line buffering?

Voici ma commande que j'utilise dans un script pour grep data en temps réel. Il ne semble pas extraire 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"?

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

Lors de l'utilisation non interactive, la plupart des commandes standard, telles que grepname__, tamponnent la sortie, ce qui signifie que les données ne sont pas écrites immédiatement dans stdoutname__. Il collecte une grande quantité de données (dépend du système d’exploitation, sous Linux, souvent de 4096 octets) avant d’écrire.

Dans votre commande, la sortie de grepest dirigée vers stdinde sedname__, de sorte que greptamponne sa sortie.

Ainsi, l'option --line-buffered entraîne grepà l'aide du tampon de ligne, ce qui signifie que l'écriture est produite chaque fois qu'il voit une nouvelle ligne, au lieu d'attendre 4096 octets par défaut. Mais dans ce cas, vous n'avez pas du tout besoin de grepname__, utilisez simplement tail+ sedname__:

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

activer la mise en mémoire tampon des lignes ou utiliser -o0 pour désactiver la mémoire tampon.

Remarque

39
cuonglm