2013-09-30 16 views
8

Tôi muốn grep mẫu từ nhiều tệp nhật ký đang được cập nhật liên tục bởi một số quy trình và kết thúc đầu ra của grep này liên tục. Dưới doesnt làm việc chỉ huy và tôi nhận được - đuôi: cảnh báo: sau đầu vào tiêu chuẩn vô thời hạn là không hiệu quảđuôi nhiều tệp và grep đầu ra

tail -f | grep --line-buffered "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log 

Ai đó có thể giúp phân loại này ra?

+0

Duplicate của http://superuser.com/câu hỏi/59471/đơn giản-sử dụng-of-đuôi-grep-nhiều điều kiện –

Trả lời

10

Bạn nên có một cái nhìn tại multitail công cụ (Cài đặt sử dụng sudo apt-get install multitail)

Tóm lại, với multitail, bạn cần sử dụng cờ --mergeall để xem đầu ra của tất cả ở một nơi

multitail --mergeall /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: " 

Bạn có thể làm như vậy mà không sử dụng grep

multitail -E "Search this: " --mergeall /var/links/proc2/id/myprocess*/Daily/myprocess*.log 

Để xem các đầu ra riêng biệt sử dụng multitail, này sẽ cung cấp cho các tên tập tin cũng.

multitail -E "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log 
+2

Bạn đang sử dụng phiên bản multitail nào? Tôi không thể grep đầu ra của multitail với phiên bản được đóng gói với Debian: _multitail 5.2.13_ – Thor

+0

@Thor Đã sửa câu trả lời của tôi. –

5

lỗi là bạn cung cấp tệp cho lệnh grep chứ không phải đuôi.

đuôi -f cần nhận tệp dưới dạng đầu vào. thử:

tail -f /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: " 

để có được cũng là tên tập tin (tuy nhiên nó sẽ không được như đầu ra grep nó là):

tail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered -e'^==> .* <==$' -e'Search this: ' 
+1

cảm ơn.Điều này hoạt động một phần nhưng tôi không nhận được tên tập tin mà các mẫu được tìm thấy? – 212

1

Đây là một câu hỏi thú vị và câu trả lời đơn giản nên là: Sử dụng công tắc tiền tố với đuôi, nhưng tiếc này hiện chưa được thực hiện ở hầu hết các phiên bản của tail.

Như tôi thấy, bạn có hai tùy chọn: điều chỉnh các công cụ chuẩn cho công việc (xem Udys answer) hoặc viết công cụ của riêng bạn bằng ngôn ngữ lập trình/kịch bản yêu thích của bạn.

Dưới đây là một cách bạn có thể thực hiện với mô-đun File::Tail::Multi cho perl. Lưu ý rằng bạn có thể cần cài đặt mô-đun từ CPAN (cpan -i File::Tail::Multi).

Lưu tập lệnh sau, ví dụ: mtail vào đường dẫn thực thi của bạn và làm cho tập lệnh thực thi được.

#!/usr/bin/env perl 

use File::Tail::Multi; 

$| = 1; # Enable autoflush 

$tail = File::Tail::Multi->new(RemoveDuplicate => 0, 
           OutputPrefix => 'f', 
           Files   => \@ARGV); 

while(1) { $tail->read; $tail->print; sleep 2 } 

Thay đổi OutputPrefix để 'p' nếu bạn thích tiền tố đường dẫn đầy đủ.

Run nó như thế này:

mtail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: " 

Bạn không cần phải xác định --line-buffered khi grep là lệnh cuối cùng, vì vậy đây là đủ:

mtail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep "Search this: " 
+0

1) Điều này khác với việc sử dụng multitail như thế nào? 2) Nó sẽ xuất ra bởi tên tập tin, như OP hỏi trong các bình luận @Udys answer> –

+0

@ ansh0l: 1) multitail xuất kết quả của nó trong các lời nguyền, mà không phải là greppable. 2) Có, mỗi dòng có tên tệp gốc có tiền tố. – Thor

+0

Ah ok, +1 cho lời nguyền. Nhưng với cờ -E của multitail, bạn sẽ không cần phải tự làm grep. –

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