2013-09-30 64 views
8

我想從多個日誌文件中grep一個模式,這些日誌文件會被某些進程不斷更新並尾隨grep連續輸出。 下面命令不工作,我得到 - 尾:警告:無限期跟隨標準輸入無效尾多個文件和grep的輸出

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

有人可以幫助解決了這一點?

+0

重複的http://superuser.com/questions/59471/simple-use-tail-grep-multiple-conditions –

回答

10

你應該看看multitail工具(安裝使用sudo apt-get install multitail

總之,使用multitail,您需要使用--mergeall標誌在一個地方查看所有輸出

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

你可以做同樣沒有用grep

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

要單獨查看輸出使用multitail,這會給文件名以及

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

你使用的是什麼版本的multitail?我無法用Debian打包的版本grep輸出multitail:_multitail 5.2.13_ – Thor

+0

@Thor更正了我的答案。 –

5

錯誤在於您將文件提供給grep命令而不是尾部。

尾部-f需要獲取文件作爲輸入。嘗試:

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

也得到文件名(但它不會像grep的輸出,它是):

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

謝謝。這部分工作,但我沒有得到的模式找到的文件名? – 212

1

這是一個有趣的問題,簡單的答案應該是:使用前綴交換機尾,但遺憾的是目前這不是在tail大多數版本中實現。

正如我所看到的,您有兩種選擇:使標準工具適應任務(請參閱Udys answer)或使用您最喜愛的腳本/編程語言編寫自己的工具。

以下是您可以使用File::Tail::Multi模塊爲perl執行此操作的一種方法。請注意,您可能需要從CPAN安裝模塊(cpan -i File::Tail::Multi)。

保存以下腳本,例如mtail添加到您的可執行文件路徑並使腳本可執行。

#!/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 } 

變化OutputPrefix'p'如果你喜歡全路徑前綴。

運行這樣的:

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

你並不需要指定--line-bufferedgrep爲最後一個命令,所以這是足夠了:

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

1)這與使用multitail有什麼不同? 2)是否按文件名輸出,如OP在@Udys中的評論中所要求的答案> –

+0

@ ansh0l:1)multitail以curses輸出其結果,這是不可糾正的。 2)是的,每行都有始發文件的名稱。 – Thor

+0

好的,詛咒+1。但是使用-E標誌的多字節標誌,你不需要執行grep本身。 –