Что делает буферизация строки grep?

Вот моя команда, которую я использую в сценарии для grep данные в реальном времени. Похоже, он не обрабатывает данные в реальном времени правильно, поскольку пропускает некоторые строки.

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

Что будет делать следующая команда? Что такое "буферизация строки"?

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

1 ответ

Решение

При использовании неинтерактивно большинство стандартных команд включают grep, буферизировать вывод, то есть он не записывает данные немедленно stdout, Он собирает большой объем данных (зависит от ОС, в Linux, часто 4096 байт) перед записью.

В вашей команде grepвыходной канал stdin из sed команда, так grep буферизировать его вывод.

Так, --line-buffered вариант, вызывающий grep использование буфера строки, что означает запись выходных данных каждый раз, когда он видит новую строку, вместо ожидания достижения 4096 байт по умолчанию. Но в этом случае вам не нужно grep вообще, просто используйте tail + sed:

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

С командой, у которой нет опции для изменения буфера, вы можете использовать GNU coreutils stdbuf

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

включить буферизацию строки или использовать -o0 отключить буфер.

Заметка

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