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줄 이후에 중지"

\감사합니다 {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}

행운을 빌어요!

관련 정보