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


25

Вот моя команда, которую я использую в сценарии для 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

Ответы:


44

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

В вашей команде, grepвыход «s передаются по конвейеру 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для отключения буфера.

Заметка

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.