Вероятно, это проблема буферизации. Смотрите этот пост об отключении автоматической буферизации при использовании каналов . Вы можете использовать unbuffer
команду из expect
:
$ unbuffer tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
Изменить : Так как у вас есть более длинный конвейер, вам, вероятно, нужно снять буфер каждой команды (кроме последней):
$ unbuffer tail -f log.txt | unbuffer egrep 'WARN|ERROR' | tee filtered_output.txt
Редактировать 2 : unbuffer
доступно на Cygwin из expect
пакета с исходным кодом (например, ожидаем-20030128-1-src.tar.bz2 , находится в expect/examples
папке), но это очень короткий скрипт. Если у вас expect
уже установлен пакет, просто поместите его в скрипт, который называется unbuffer
в вашем /usr/local/bin
каталоге:
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
eval spawn -noecho $argv
set timeout -1
expect
В Debian unbuffer
команда предоставляется в expect-dev
пакете и устанавливается как expect_unbuffer
.
expect
пакетПри использовании команды, которая на самом деле не «завершает» (например,
tail -f
), это на самом деле не очень хорошо работает или не очень хорошо (вообще).источник
Это версия,
unbuffer
которую я имею:источник
Как уже отмечали другие, вы можете использовать
unbuffer
утилиту от Expect.Тем не менее, обратите внимание, что в зависимости от вашей системы и доступной версии Expect вам может понадобиться использовать
-p
переключатель для снятия буфера. Ссылаясь на справочную страницу:Так что вам может понадобиться этот вызов:
Кстати, см. Эту статью для подробного объяснения проблемы буферизации вывода: http://www.pixelbeat.org/programming/stdio_buffering/
источник