arquivo de log: somente entradas de processo anteriores a “MMM DD HH: MM: SS”

1

Eu preciso processar meu arquivo de log /var/log/mylogs.log . Estou interessado apenas nas novas entradas, digamos, desde Jul 20 15:00:00 , mas o log também contém entradas mais antigas.

Existe alguma maneira simples, como eu poderia cat apenas entradas mais antigas que a data certa?

    
por Martin Vegter 06.08.2013 / 08:28

5 respostas

2

Você pode escrever um pequeno script bash que use date para analisar as datas:

#!/usr/bin/env bash

## Your date threshold
limit="Jul 20 15:00:00"
## Your limit in seconds since the UNIX epoch
limit_seconds=$(date -d "$limit" +%s)

while read line; do
    ## Extract the date and convert to seconds since epoch for comparison
    date=$(date -d "$(echo "$line" | cut -d ' ' -f -4)" +%s);
    ## Is this newer than the limit? If yes, print the line
    if [ "$date" -ge "$limit_seconds" ]; then
    echo "$line"
    fi

done

Salve este script no seu caminho (por exemplo, /usr/local/bin/parse_log.sh ) e você poderá executá-lo da seguinte forma:

parse_log.sh < /var/log/mylogs.log
    
por 06.08.2013 / 15:43
0

Você pode estar interessado em fazer isso com o perl:

perl -wlne '/^Jul\ 20\ 15\:00\:00/ .. eof() and print' /path/to/logfile.txt

Você pode querer ajustar o regex às suas necessidades exatas.

    
por 06.08.2013 / 08:56
0

Isso é feito melhor em uma linguagem que facilita a manipulação de datas. Presumo que cada linha de log comece com uma data no formato mmm dd HH:MM:SS e que todas as entradas de log sejam do ano atual.

<var/log/mylogs.log perl -MDate::Parse -e '
    $cutoff = str2time($ARGV[0]);
    while (<STDIN>) {
        print if /^(... [ 0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9])/ and
                 str2time($1) <= $cutoff
    }
' 'Jul 20 15:00:00'

Este snippet imprime todas as linhas com datas mais antigas. Se você quiser as entradas mais recentes, inverta a comparação ( str2time($1) >= $cutoff ). Ao imprimir entradas mais antigas, você pode economizar um pouco de processamento resgatando assim que uma entrada muito atrasada for atingida.

<var/log/mylogs.log perl -MDate::Parse -e '
    $cutoff = str2time($ARGV[0]);
    while (<STDIN>) {
        exit if /^(... [ 0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9])/ and
             str2time($1) > $cutoff;
        print;
    }
' 'Jul 20 15:00:00'
    
por 07.08.2013 / 00:05
0

Procurando a mesma resposta, encontrei este tópico antigo

E eu resolvi isso usando o grep com -B option:

cat /var/log/mylogs.log | grep -B 1000 "Jul 20 15:00:00"

Ele mostrará a linha com essa data e 1000 linhas antes dela. Simples e fácil Você só precisa ter certeza de que você está com grep ing data que existe em seu arquivo de log. Da mesma forma com a opção -A , você pode procurar por entradas mais recentes.

    
por 08.01.2015 / 10:54
-1

Experimente sed também:

sed -n '/^Jul\ 20\ 15\:00\:00/,/eof()/p' /path/to/logfile.txt
    
por 06.08.2013 / 11:42