12

我想从多个日志文件中提取一个模式,这些日志文件正在被某些进程不断更新,并不断地跟踪这个 grep 的输出。下面的命令不起作用,我得到

  • tail:警告:无限期地遵循标准输入是无效的
tail -f  | grep --line-buffered "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log

有人可以帮忙解决这个问题吗?

4

3 回答 3

12

你应该看看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 
于 2013-09-30T08:35:01.397 回答
9

错误是您将文​​件提供给 grep 命令而不是尾部。

tail -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: '
于 2013-09-30T08:08:32.803 回答
1

这是一个有趣的问题,简单的答案应该是:将前缀开关与 tail 一起使用,但不幸的是,目前大多数版本的tail.

在我看来,您有两个选择:使标准工具适应任务(请参阅Udys答案)或使用您最喜欢的脚本/编程语言编写自己的工具。

以下是您可以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-buffered何时grep是最后一个命令,因此这就足够了:

mtail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep "Search this: "
于 2013-09-30T12:19:24.620 回答