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 unbuffercomando 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 : unbufferestá disponible en Cygwin desde el expectpaquete fuente (por ejemplo, expect-20030128-1-src.tar.bz2 , que se encuentra en la expect/examplescarpeta), pero es un script muy corto. Si ya tiene el expectpaquete instalado, simplemente colóquelo en un script llamado unbufferen su /usr/local/bindirectorio:
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
eval spawn -noecho $argv
set timeout -1
expect
En Debian, el unbuffercomando se proporciona en el expect-devpaquete y se instala como expect_unbuffer.
expectpaquete.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
unbufferque tengo:fuente
Como otros han señalado, puede usar la
unbufferutilidad 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
-pinterruptor 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