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 để stdin
các sed
lệnh, do đó grep
đệm đầu ra của nó.
Vì vậy, --line-buffered
tùy chọn gây ra grep
bằ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