Що робить буферизація греп-ліній?


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.