tail -fa 文件 10 分钟/直到 N 个匹配行?

tail -fa 文件 10 分钟/直到 N 个匹配行?

我有一个日志文件,我按如下方式处理:

grep pattern /var/log/whatever.log | \
    cut ... | sort | uniq -c | sort -rn | \
    etc....

然而,日志文件相当大,并且记录从一天开始的事件。它也被不断附加。我只想处理最后的文件的接下来 10 分钟。

所以我正在寻找类似以下的东西:

killafter 600 tail -f /var/log/whatever.log | stuff

或者,更好的是(无论需要多长时间才能捕获 1000 条匹配行,请等待):

tail -f /var/log/whatever.log | grep pattern | stopafter -lines 1000 | stuff

有没有任何工具可以让我做到这一点?

答案1

roaima 正确地将您指向timeout命令,并head在读取所需的行数后实际终止,所以我希望

timeout 600s tail -f ‹logfile› | ‹filter› | head -n 1000

你会到达那里的。

答案2

默认情况下,超时会终止进程,管道也会被终止。

timeout --foreground 600s tail -n 0 -f logfile | ...filter | head -n 1000| ...
  • timeout --foreground否则我们只会看到“终止”
  • tail -n 0 -f仅显示新的日志行
  • head -n 1000“1000行后停止”

\谢谢{罗艾玛和乌尔里希·施瓦茨}

答案3

这段perl代码会给你一个数过的tail

#!/usr/bin/perl
#
# Usage tailmax.pl <filename> [<num_lines>]
#
use strict;
use warnings;

use File::Tail;

my $logfile = shift @ARGV;
my $pattern = shift @ARGV || '';
my $count = shift @ARGV || -1;

my $fh = File::Tail->new(name => $logfile, tail => 0, interval => 0, maxinterval => 2) or
    die "Cannot open $logfile: $!\n";

while ($count != 0 and defined (my $line = $fh->read)) {
    if ($pattern eq '' or $line =~ /$pattern/) {
        print "$line";
        $count-- if $count > 0;
    }
}

如果将其保存到诸如 之类的文件中并使其可执行,则可以像这样调用它,这将为您提供来自包含 RE 的/usr/local/bin/tailmax日志文件的接下来 100 条消息。 (您可能需要阅读此文件。)/var/log/messagessomepatternroot

tailmax /var/log/messages 'somepattern' 100

答案4

我很难回答乌尔里希·施瓦茨因为head似乎从来没有看过stdin所以尝试以下是否有帮助。

timeout 600s tail -f {logfile} | grep -m 1000 {pattern}

祝你好运!

相关内容