我想从多个日志文件中提取一个模式,这些日志文件正在被某些进程不断更新,并不断地跟踪这个 grep 的输出。下面的命令不起作用,我得到
- tail:警告:无限期地遵循标准输入是无效的
tail -f | grep --line-buffered "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log
有人可以帮忙解决这个问题吗?
你应该看看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
错误是您将文件提供给 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: '
这是一个有趣的问题,简单的答案应该是:将前缀开关与 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: "