Probablemente sea un problema de almacenamiento en búfer. Vea esta publicación SO sobre cómo deshabilitar el almacenamiento en búfer automático cuando se usan tuberías . Puede usar el unbuffer
comando desde expect
:
$ unbuffer tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
Editar : dado que tiene una tubería más larga, es probable que necesite liberar el búfer de cada comando (excepto el último):
$ unbuffer tail -f log.txt | unbuffer egrep 'WARN|ERROR' | tee filtered_output.txt
Edición 2 : unbuffer
está disponible en Cygwin desde el expect
paquete fuente (por ejemplo, expect-20030128-1-src.tar.bz2 , que se encuentra en la expect/examples
carpeta), pero es un script muy corto. Si ya tiene el expect
paquete instalado, simplemente colóquelo en un script llamado unbuffer
en su /usr/local/bin
directorio:
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
eval spawn -noecho $argv
set timeout -1
expect
En Debian, el unbuffer
comando se proporciona en el expect-dev
paquete y se instala como expect_unbuffer
.
expect
paquete.Cuando se usa un comando que realmente no 'termina' (como
tail -f
), esto realmente no funciona o no funciona bien (en absoluto).fuente
Esta es la versión de la
unbuffer
que tengo:fuente
Como otros han señalado, puede usar la
unbuffer
utilidad de Expect.Sin embargo, tenga en cuenta que, dependiendo de su sistema y la versión disponible de Expect, es posible que necesite usar el
-p
interruptor para eliminar el búfer. Citando la página del manual:Entonces puede que necesite esta invocación:
Por cierto, consulte este artículo para obtener una explicación detallada del problema del búfer de salida: http://www.pixelbeat.org/programming/stdio_buffering/
fuente