2009-06-09 31 views
26

Tôi đang sử dụng 'tail -f' để theo dõi tệp nhật ký khi tệp được cập nhật; tiếp theo tôi viết kết quả đầu ra của lệnh đó thành grep để chỉ hiển thị các dòng có chứa một cụm từ tìm kiếm ("org.springframework" trong trường hợp này); Cuối cùng tôi muốn làm là đường ống đầu ra từ grep để một lệnh thứ ba, 'cắt':Làm thế nào để bạn đầu vào đường ống thông qua grep để tiện ích khác?

tail -f logfile | grep org.springframework | cut -c 25- 

Lệnh cắt sẽ loại bỏ 25 ký tự đầu tiên của mỗi dòng cho tôi nếu nó có thể có được đầu vào từ grep! (Nó hoạt động như mong đợi nếu tôi loại bỏ 'grep' khỏi chuỗi.)

Tôi đang sử dụng Cygwin với bash.

Kết quả thực tế: Khi tôi thêm ống thứ hai để kết nối với lệnh 'cắt', kết quả là nó treo, như thể nó đang chờ đầu vào (trong trường hợp bạn đang băn khoăn).

+0

Nếu tôi dừng lại sau khi grep (không có ống để 'cắt') , nó hoạt động (không tước 24 ký tự đầu tiên hoặc 25 ký tự đầu tiên). – les2

+0

Vấn đề thực sự ở đây, đó là 'tail -f' không bao giờ kết thúc, vì vậy phần còn lại của đường ống tiếp tục chờ đợi thêm đầu vào – Hasturkun

Trả lời

10

Trên hệ thống của tôi, khoảng 8K đã được đệm trước khi tôi nhận được bất kỳ đầu ra nào. Chuỗi này đã làm việc để theo dõi tệp ngay lập tức:

tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done 
+0

vừa trở lại điều này và thao tác này đã làm việc – les2

-1

Điều bạn phải làm tốt - đó là toàn bộ ý tưởng về đường ống. Vấn đề duy nhất tôi thấy là, trong phiên bản cut Tôi có (GNU coreutiles 6.10), bạn nên sử dụng cú pháp cut -c 25- (tức là sử dụng dấu trừ thay vì dấu cộng) để xóa 24 ký tự đầu tiên.

Bạn cũng đang tìm kiếm các mẫu khác nhau trong hai ví dụ của mình, trong trường hợp có liên quan.

+0

oops! Tôi đang sử dụng dấu 'trừ' - đó là lỗi đánh máy trong bài đăng của tôi ở đây – les2

29

Giả sử GNU grep, thêm --line-buffered vào dòng lệnh của bạn, ví dụ:

tail -f logfile | grep --line-buffered org.springframework | cut -c 25- 

Edit:

tôi thấy grep đệm không phải là vấn đề duy nhất ở đây, như cắt không cho phép linewise đệm.

bạn có thể muốn thử thay thế nó bằng một cái gì đó bạn có thể kiểm soát, chẳng hạn như sed:

tail -f logfile | sed -u -n -e '/org\.springframework/ s/\(.\{0,25\}\).*$/\1/p' 

hoặc awk

tail -f logfile | awk '/org\.springframework/ {print substr($0, 0, 25);fflush("")}' 
+1

- đệm trực tuyến không hoạt động đối với tôi - giúp đệm * đầu ra * của grep. Nếu bạn làm đuôi -f logfile | cut -c 25- nó vẫn chỉ nằm ở đó. Việc đệm đang được thực hiện trên đầu ra của đuôi. –

+0

Đã sửa đổi, có vẻ như bạn đang bị cắn bởi bộ đệm đồ hoạ bị cắt, chúng sẽ làm việc cho bạn – Hasturkun

+0

Cảm ơn bạn! điều này thực sự hữu ích khi xâu chuỗi nhiều greps. ví dụ. someprogwithoutput | grep --line-buffered filterpattern | grep --color highlightpattern – Superole

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