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
Lors de l'utilisation non interactive, la plupart des commandes standard, telles que grep
name__, tamponnent la sortie, ce qui signifie que les données ne sont pas écrites immédiatement dans stdout
name__. 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 grep
est dirigée vers stdin
de sed
name__, de sorte que grep
tamponne 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 grep
name__, utilisez simplement tail
+ sed
name__:
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