tail -faファイル10分/N本のマッチラインまで?

tail -faファイル10分/N本のマッチラインまで?

次のように処理するログファイルがあります。

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

ただし、ログファイルの容量がかなり大きく、1日から始まるイベントを記録します。また、継続的に追加されます。私はただ相手にしたい最後次の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行後に停止」

\ありがとう{Emma LuoとUlrich Schwarz}

答え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;
    }
}

次のファイルに保存して実行可能にしたら、これを呼び出すことができます。これにより、/usr/local/bin/tailmaxREを含むログファイルに次の100個のメッセージが表示されます。 (この記事を読んでみてください。)/var/log/messagessomepatternroot

tailmax /var/log/messages 'somepattern' 100

答え4

答えるのは難しいです。ウリヒ・シュワルツ以前見たheadことがないので、役に立つ場合は、stdin次のことを試してみましょう。

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

頑張ってください!

関連情報