передача по каналу в режиме реального времени

Это - больше концептуальная вещь, чем текущая проблема.

Был бы это быть возможным сделать это:

tail -f <file> | grep "string" | sed 's/stuff//g' >> output.txt

Проблема я думаю, является этим tail -f никогда не завершается так, это не будет прогрессировать в команде. Я пытаюсь считать и произвести файл в режиме реального времени. Если бы это не работает, как я сделал бы это?

1
задан 16 December 2014 в 13:41

1 ответ

Большинство команд, что выходные данные на stdout, (который включает grep и sed) буферизуют свой вывод, когда это не идет в терминал. Таким образом, они ожидают большого блока вывода для сбора (как 4 кибибита) прежде сбрасывание блок в файл или канал. Это обычно более эффективно. Некоторые команды позволяют Вам переопределять это, как GNU grep, который имеет --line-buffered опция, и GNU sed имеет --unbuffered опция. Для команд, которые не имеют способа переопределить буферизацию, можно использовать инструменты как unbuffer или stdbuf.

В этом случае, хотя, я рассмотрел бы использование GNU awk вместо этого, где можно управлять сбрасыванием stdout сами (с функцией сброса).

tail -f file | gawk '/string/{ gsub(/stuff/, "") } { print; fflush() }' > output.txt

См. BashFAQ № 9 для больше на буферизации.

2
ответ дан 10 November 2019 в 23:28

Другие вопросы по тегам:

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