Как продолжение из моего последнего сообщения, где я использовал grep & tail -f
найти происшествия "редких" событий. Я хотел бы записать это в другом файле.
Я попытался повернуться
tail -f log.txt | egrep 'WARN|ERROR'
в
tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
Файл создается, но ничто не заполняется, действительно ли это - кэширующаяся проблема или иначе? Как я получил бы добавление в реальном времени вывода своего хвоста в новый файл?
Это - вероятно, проблема буферизации. Посмотрите, что это ТАК отправляет при отключении автобуферизации при использовании каналов. Можно использовать 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
исходный пакет (например, 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
пакет.
– quack quixote
23.10.2009, 19:15
При использовании команды, которая действительно 'не заканчивается' (такой как tail -f
), это на самом деле действительно не работает или что хорошо (вообще).
Необходимо смочь перенаправить вывод к текстовому файлу. Попробуйте это:
tail -f log.txt | egrep 'WARN|ERROR' > filtered_output.txt
Это - версия unbuffer
то, что я имею:
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
if {[string compare [lindex $argv 0] "-p"] == 0} {
# pipeline
set stty_init "-echo"
eval spawn -noecho [lrange $argv 1 end]
close_on_eof -i $user_spawn_id 0
interact {
eof {
# flush remaining output from child
expect -timeout 1 -re .+
return
}
}
} else {
set stty_init "-opost"
set timeout -1
eval spawn -noecho $argv
expect
}
Как другие указали, можно использовать unbuffer
утилита от Ожидает.
Обратите внимание, однако, что в зависимости от Вашей системы и доступной версии Ожидают, Вы, возможно, должны использовать -p
переключатель для освобождения буфера. Цитирование страницы справочника:
Normally, unbuffer does not read from stdin. This simplifies use of unbuffer in some situations. To use unbuffer in a pipeline, use
the -p flag. Example:
process1 | unbuffer -p process2 | process3
Таким образом, Вам, возможно, понадобился бы этот вызов:
unbuffer -p tail -f log.txt | unbuffer -p egrep 'WARN|ERROR' | tee filtered_output.txt
BTW, см. эту статью для полного объяснения выходной проблемы буферизации: http://www.pixelbeat.org/programming/stdio_buffering/