Запись “хвоста-f” вывод в другой файл

Как продолжение из моего последнего сообщения, где я использовал grep & tail -f найти происшествия "редких" событий. Я хотел бы записать это в другом файле.

Я попытался повернуться

tail -f log.txt | egrep 'WARN|ERROR'

в

tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt

Файл создается, но ничто не заполняется, действительно ли это - кэширующаяся проблема или иначе? Как я получил бы добавление в реальном времени вывода своего хвоста в новый файл?

34
задан 20.03.2017, 12:17

5 ответов

Буферизация является проблемой.

Сделайте это этот путь,

tail -f log.txt | egrep --line-buffered 'WARN|ERROR' | tee filtered_output.txt
#                       ^^^^^^^^^^^^^^^

Подтвержденный для работы над Cygwin также.

44
ответ дан 07.12.2019, 09:03

Это - вероятно, проблема буферизации. Посмотрите, что это ТАК отправляет при отключении автобуферизации при использовании каналов. Можно использовать 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.

6
ответ дан 07.12.2019, 09:03
  • 1
    является там способом выполнить это с cygwin? – Mike 23.10.2009, 18:53
  • 2
    добавил информацию об использовании в cygwin; Вам будет нужно expect пакет. – quack quixote 23.10.2009, 19:15

При использовании команды, которая действительно 'не заканчивается' (такой как tail -f), это на самом деле действительно не работает или что хорошо (вообще).

Необходимо смочь перенаправить вывод к текстовому файлу. Попробуйте это:

tail -f log.txt | egrep 'WARN|ERROR' > filtered_output.txt
4
ответ дан 07.12.2019, 09:03

Это - версия 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
}
2
ответ дан 07.12.2019, 09:03
  • 1
    +1 благодарит за дополнительную информацию, не знают, является ли это cygwin-дружественным, но это похоже на более интеллектуальный сценарий. исправление – quack quixote 25.10.2009, 02:21

Как другие указали, можно использовать 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/

2
ответ дан 07.12.2019, 09:03

Теги

Похожие вопросы