Bộ đệm dòng grep làm gì?


25

Đây là lệnh của tôi mà tôi đang sử dụng trong một tập lệnh cho grepdữ liệu thời gian thực. Nó dường như không kéo dữ liệu thời gian thực một cách chính xác vì nó chỉ bỏ lỡ một số dòng.

tail -f <file> | fgrep "string" | sed 's/stuff//g' >> output.txt

Lệnh sau sẽ làm gì? "Bộ đệm dòng" là gì?

tail -f <file> | fgrep --line-buffered "string" | sed 's/stuff//g' >> output.txt

Câu trả lời:


44

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.