我想从多个日志文件中获取一个模式,这些日志文件正在被某些进程不断更新,并且会连续地延迟这个grep的输出。 下面的命令不起作用,我得到了
- tail:警告:无限期遵循标准输入无效
tail -f | grep --line-buffered "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log
有人可以帮忙解决这个问题吗?
答案 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: "