尾部多个文件和grep输出

时间:2013-09-30 08:05:50

标签: unix grep tail

我想从多个日志文件中获取一个模式,这些日志文件正在被某些进程不断更新,并且会连续地延迟这个grep的输出。 下面的命令不起作用,我得到了

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

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

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:6)

错误在于您将文件提供给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: '

答案 2 :(得分: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-buffered是最后一个命令时,您无需指定grep,所以这就足够了:

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