Это - больше концептуальная вещь, чем текущая проблема.
Был бы это быть возможным сделать это:
tail -f <file> | grep "string" | sed 's/stuff//g' >> output.txt
Проблема я думаю, является этим tail -f
никогда не завершается так, это не будет прогрессировать в команде. Я пытаюсь считать и произвести файл в режиме реального времени. Если бы это не работает, как я сделал бы это?
Большинство команд, что выходные данные на 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 для больше на буферизации.