C'est probablement un problème de mise en mémoire tampon. Voir ce message SO sur la désactivation de la mise en mémoire tampon automatique lors de l'utilisation de canaux . Vous pouvez utiliser la unbuffer
commande depuis expect
:
$ unbuffer tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
Edit : Étant donné que vous avez un pipeline plus long, vous devez probablement annuler la mise en mémoire tampon de chaque commande (sauf la dernière):
$ unbuffer tail -f log.txt | unbuffer egrep 'WARN|ERROR' | tee filtered_output.txt
Edit 2 : unbuffer
est disponible sur Cygwin à partir du expect
paquet source (par exemple expect-20030128-1-src.tar.bz2 , trouvé dans le expect/examples
dossier), mais c'est un script très court. Si vous avez expect
déjà installé le paquet, mettez-le simplement dans un script appelé unbuffer
dans votre /usr/local/bin
répertoire:
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
eval spawn -noecho $argv
set timeout -1
expect
Sur Debian, la unbuffer
commande est fournie dans le expect-dev
paquet et est installée en tant que expect_unbuffer
.
expect
paquet.Lorsque vous utilisez une commande qui ne «termine» pas vraiment (comme
tail -f
), cela ne fonctionne pas vraiment ou si bien (pas du tout).la source
Voici la version
unbuffer
que j'ai:la source
Comme d'autres l'ont souligné, vous pouvez utiliser l'
unbuffer
utilitaire d'Expect.Notez, cependant, qu'en fonction de votre système et de la version disponible d'Expect, vous devrez peut-être utiliser le
-p
commutateur pour annuler la mise en mémoire tampon. Citant la page de manuel:Vous pourriez donc avoir besoin de cette invocation:
BTW, consultez cet article pour une explication approfondie du problème de mise en mémoire tampon de sortie: http://www.pixelbeat.org/programming/stdio_buffering/
la source