Khi sử dụng không tương tác, hầu hết các lệnh tiêu chuẩn, bao gồm grep, đệm đầu ra, nghĩa là nó không ghi dữ liệu ngay lập tức stdout. Nó thu thập lượng dữ liệu lớn (phụ thuộc vào HĐH, trong Linux, thường là 4096 byte) trước khi viết.
Trong lệnh của bạn, grepđầu ra 's được đường ống để stdincác sedlệnh, do đó grepđệm đầu ra của nó.
Vì vậy, --line-bufferedtùy chọn gây ra grepbằng cách sử dụng bộ đệm dòng, nghĩa là viết đầu ra mỗi lần nó nhìn thấy một dòng mới, thay vì chờ để đạt 4096 byte theo mặc định. Nhưng trong trường hợp này, bạn hoàn toàn không cần grep, chỉ cần sử dụng tail+ sed:
tail -f <file> | sed '/string/s/stuff//g' >> output.txt
Với lệnh không có tùy chọn để sửa đổi bộ đệm, bạn có thể sử dụng GNU coreutils stdbuf
tail -f <file> | stdbuf -oL fgrep "string" | sed 's/stuff//g' >> output.txt
để bật bộ đệm dòng hoặc sử dụng -o0để vô hiệu hóa bộ đệm.
chú thích