다음과 같이 처리하는 로그 파일이 있습니다.
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/tailmax
RE가 포함된 로그 파일에서 다음 100개의 메시지가 제공됩니다. (이 글을 읽어보시면 좋을 것 같습니다.)/var/log/messages
somepattern
root
tailmax /var/log/messages 'somepattern' 100
답변4
답변하기가 어렵네요울리히 슈바르츠이전에 본 head
적이 없으므로 stdin
도움이 된다면 다음을 시도해 보겠습니다.
timeout 600s tail -f {logfile} | grep -m 1000 {pattern}
행운을 빌어요!