tail -f um arquivo por 10 minutos / até N linhas correspondentes?

4

Eu tenho um arquivo de log que eu processo da seguinte forma:

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

No entanto, o arquivo de log é bastante grande e registra eventos desde o início do dia. Também é acrescentado constantemente. Gostaria de processar apenas os últimos próximos 10 minutos do arquivo.

Estou procurando algo como o seguinte:

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

Ou melhor ainda (espere o tempo necessário para capturar 1000 linhas correspondentes):

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

Existe alguma ferramenta que me permita fazer isso?

    
por Roger Lipscombe 09.09.2016 / 11:14

3 respostas

5

roaima o aponta corretamente no comando timeout , e head na verdade termina depois de ter lido o número desejado de linhas, então eu espero que com

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

você chegaria lá.

    
por 09.09.2016 / 11:24
1

Por padrão, o tempo limite mata o processo e o canal é eliminado.

timeout --foreground 600s tail -n 0 -f logfile | ...filter | head -n 1000| ...
  • timeout --foreground senão veríamos apenas "Terminado"
  • tail -n 0 -f para mostrar apenas as novas linhas de log
  • head -n 1000 para "parar após 1000 linhas"

\ thanks {roaima e Ulrich Schwarz}

    
por 09.09.2016 / 12:06
0

Este código perl fornecerá um % contadotail

#!/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;
    }
}

Se você salvá-lo em um arquivo como /usr/local/bin/tailmax e torná-lo executável, poderá chamá-lo assim, o que fornecerá as próximas 100 mensagens do arquivo de log /var/log/messages que contêm o RE somepattern . (Você pode precisar de root para ler este arquivo.)

tailmax /var/log/messages 'somepattern' 100
    
por 09.09.2016 / 18:40

Tags