2013-09-30 60 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本身。 –