2013-01-16 36 views
13

Tôi đang cố gắng xây dựng một kịch bản lệnh shell để giám sát một số tệp nhật ký. Tôi đang sử dụng một lệnh như thế này:tail -f vào grep vào cắt không hoạt động đúng

tail -f /var/somelog | grep --line-buffered " some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " " 

các log file là như:

some test and p l a c e h o l d e r 3 
some test and p l a c e h o l d e r 4 
some test and p l a c e h o l d e r 5 
some test and p l a c e h o l d e r 6 

và vân vân .. Vấn đề của tôi là đầu ra của lệnh không hiển thị cuối cùng dòng

some test and p l a c e h o l d e r 6 

cho đến khi dòng

some test and p l a c e h o l d e r 7 

được thêm vào nhật ký.

Tôi hy vọng tôi đã giải thích rõ vấn đề của mình. Bất cứ ai có thể giúp tôi giải quyết vấn đề này? Cảm ơn bạn :)

+4

Có thể các dòng nhật ký không được kết thúc bằng nguồn cấp dữ liệu dòng, nhưng bắt đầu bằng một dòng thay thế? Trong trường hợp này, dòng 6 sẽ không thực sự hoàn thành cho đến khi dòng 7 bắt đầu và cung cấp nguồn cấp dữ liệu dòng đó. Nếu bạn nhìn vào tệp nhật ký, hiển thị tất cả các ký tự, bạn có thấy nguồn cấp dữ liệu dòng ở cuối dòng cuối cùng không? –

+0

Tìm một dòng mới ("\ n") sử dụng 'od -c/var/somelog'. – cdarke

+0

Bạn có thấy cùng một đầu ra chỉ với 'đuôi -f' không? Nếu đó là trường hợp thì @ David đã chỉ ra nó một cách chính xác. – mtk

Trả lời

19

vấn đề gần như chắc chắn liên quan đến cách grep và cắt bộ đệm đầu ra của chúng. đây là một hack mà nên giúp bạn có được xung quanh vấn đề này, mặc dù tôi chắc chắn rằng có nhiều cách đẹp hơn để làm điều đó:

tail -f /var/somelog | while read line; do echo "$line" | grep "some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " "; done 

(đừng quên các ; done vào cuối lệnh)

cách khác , vì gawk không đệm đó là đầu ra, bạn có thể sử dụng nó ở vị trí của cut để tránh sự rườm rà trong khi vòng lặp:

tail -f log | grep --line-buffered "some test and p l a c e h o l d e r" | gawk '{print $3,$4,$14}' 

séc ra http://www.pixelbeat.org/programming/stdio_buffering/ để biết thêm về các vấn đề đệm.

+1

Nó cũng khá có thể xảy ra rằng bất cứ điều gì đang ghi vào '/ var/somelog' là đệm, vì vậy' đuôi' có thể thậm chí không thấy thay đổi cho đến khi nó tràn bộ đệm hoặc xóa đầu ra theo cách khác ... – twalberg

+0

Tôi đã thử giải pháp đầu tiên và đang làm việc. Cảm ơn sự giúp đỡ của bạn! –

+0

vui lòng trợ giúp. đừng quên rằng cách tốt nhất để nói cảm ơn xung quanh đây là chấp nhận/upvote câu trả lời hữu ích! :) – nullrevolution

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