2012-12-13 36 views
16

Đi với một bản ghi truy cập Apache điển hình, bạn có thể chạy:Piping đuôi ra mặc dù grep hai lần

tail -f access_log | grep "127.0.0.1" 

Mà sẽ chỉ cho bạn thấy các bản ghi (như họ được tạo ra) cho các địa chỉ IP cụ thể.

Nhưng tại sao điều này không thành công khi bạn đặt đường ống mặc dù grep lần thứ hai, để tiếp tục giới hạn kết quả?

Ví dụ, một đơn giản loại trừ cho ".css":

tail -f access_log | grep "127.0.0.1" | grep -v ".css" 

sẽ không hiển thị bất kỳ đầu ra.

+0

Xem thêm [grep đúp vào đuôi -f mang đến cho không có đầu ra] (http: //unix.stackexchange.com/a/164681/20661) – rubo77

Trả lời

31

Tôi tin rằng vấn đề ở đây là grep đầu tiên là đệm đầu ra có nghĩa là grep thứ hai sẽ không nhìn thấy nó cho đến khi bộ đệm bị xóa.

thử thêm --line-buffered tùy chọn trên grep đầu tiên của bạn:

tail -f access_log | grep --line-buffered "127.0.0.1" | grep -v ".css" 

Mọi chi tiết, thấy "BashFAQ/009 -- What is buffering? Or, why does my command line produce no output: tail -f logfile | grep 'foo bar' | awk ..."

10

Đây là kết quả của đệm, nó cuối cùng sẽ in khi đủ dữ liệu có sẵn.

Sử dụng tùy chọn --line-buffered theo đề nghị của Shawn Chin hoặc nếu stdbuf là có sẵn, bạn có thể nhận được tác dụng tương tự với:

tail -f access_log | stdbuf -oL grep "127.0.0.1" | grep -v ".css" 
+0

Cảm ơn Thor, bạn cũng đúng, nhưng tôi nghĩ Shawn đã đến đó ngay trước bạn. –

Các vấn đề liên quan