При використанні неінтерактивних більшість стандартних команд включають в себе 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
для відключення буфера.
Примітка