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