Extrai o número X de minutos da hora atual de um arquivo de log

1

Eu tenho um arquivo de log com o seguinte formato de timestamp

2016-06-02 13:59:58.069

O log com o qual estou trabalhando se estende por uma hora.

2016-06-02 13:05:06.144
2016-06-02 13:05:06.144
2016-06-02 13:05:06.160
2016-06-02 13:05:06.160
2016-06-02 13:05:06.176
2016-06-02 13:05:06.177
.
.
.
.
2016-06-02 14:05:03.033
2016-06-02 14:05:03.034
2016-06-02 14:05:03.034
2016-06-02 14:05:03.084
2016-06-02 14:05:03.096
2016-06-02 14:05:03.112

Quando tento usar o awk para extrair os últimos 10 minutos, ainda recebo o arquivo inteiro.

awk -vDate='date -d'now-10 minutes' +%Y/%m/%d:%H:%M:%S' '$1,$2 >   Date {print Date, $0}' logfile.log | less

Saída Awk:

2016/06/02:08:57:35 2016-06-02 13:05:06.144
. 
.
.
2016/06/02:08:57:35 2016-06-02 14:08:05.214

O que estou fazendo de errado?

    
por user53029 02.06.2016 / 16:10

3 respostas

1

Usando uma abordagem diferente. Eu recebo o vDate, grep para obter o número da linha e tail do arquivo desse número de linha:

vDate='date -d'now-10 minutes' '+%Y-%m-%d %H:%M'' 
line='grep  -n "$vDate" logfile.log | head -1  | cut -d: -f1'
tail -n +${line} logfile.log
    
por 02.06.2016 / 17:20
1

Tente

awk -vDate="'date -d'TZ="UTC" now-10 minutes' +'%Y-%m-%d %H:%M:%S.%3N''" '$1" "$2 > Date {print Date, $0}'

No padrão $1,$2 > Date , a vírgula não significa "unir esses campos" como na saída; Em vez disso, significa que o padrão é um intervalo de registros . $1 é uma string não vazia, que é sempre true , portanto a correspondência é iniciada imediatamente. Você precisa colocar um espaço literal lá para juntar os campos antes de comparar: $1" "$2

Em seguida, você pode ver na saída do seu exemplo que estava definindo Date para "2016/06/02: ...", enquanto os registros usavam "2016-06-02 ...". Como você está comparando strings de data , e / é posterior a - em ASCII, o teste nunca seria bem-sucedido. Alterar o formato da string para corresponder exatamente (com algumas citações adicionadas para protegê-lo do shell) significa que apenas os dígitos serão diferentes.

Editar: Os registros de data e hora do seu arquivo de log são algumas horas depois do que o date -d'now-10 minutes' mostra. Você pode dizer a date para usar o fuso horário relevante com uma variável de ambiente ( TZ=UTC awk ... ) ou dentro da string de data 'TZ="UTC" now...' . Se não for UTC , escolha a correta de a lista completa .

    
por 02.06.2016 / 17:16
1

awk pode imprimir as linhas de um texto em uma seção com start_pattern e end_pattern , use a seguinte sintaxe:

$ awk '/start_pattern/, /end _pattern/' filename

citação do Livro de receitas de script de shell do Linux .

Então, você pode fazer assim:

awk '/2016-06-02 13:55/, /2016-06-02 14:05/' logfile'

Você também pode gravar isso no arquivo de script se quiser:

START='date --date='now-10 minutes' '+%Y-%m-%d %H:%M''
END='date --date='now' '+%Y-%m-%d %H:%M''
awk "/$START/, /$END/" logfile
    
por 03.06.2016 / 10:14