Grepping últimos 5 minutos log

1

Eu preciso do grep no último log de 5 minutos. arquivo de log:

18-06-17 06:00:09 ID-5
18-06-17 06:00:11 ID-78
20-06-17 09:34:51 ID-Hello
21-06-17 09:20:49 link is down
22-06-17 06:00:11 ID-674
22-06-17 06:40:51 ID-2
22-06-17 06:40:55 ID-7
22-06-17 06:40:16 ID-3
22-06-17 06:42:20 ID-2

date +"%d-%m-%y %k:%M:%S"
22-06-17 06:43:40

Eu tentei:

awk -v date=$(date -d "30 minutes ago" +"%d-%m-%y %k:%M:%S") '$1" "$2 >= date { print $0 }' log

mas tem o erro:

awk: cmd. line:1: 06:43:40
awk: cmd. line-1-   ^ syntax error

Você pode me ajudar com esse problema?

    
por Oleksii 22.06.2017 / 08:31

2 respostas

0

Se sua data / hora foi estruturada em aaa-mm-dd hh: mm: ss em vez de dia primeiro, você pode realizar comparações de sequência para filtrar as linhas após uma determinada data. Para reformatar o uso de dados

sed 's/\(..\)-\(..\)-\(..\)\(.*\)/--/' log > log.reformatted

Você pode usar o awk para imprimir linhas depois de uma determinada data e hora, concatenando-as juntas, por exemplo

awk '$1 " " $2 >= "17-06-22 06:40:00"' log.reformatted

O seu uso da data para obter o tempo há 30 minutos é bom - basta alterá-lo para o formato ano-mês-dia. Você não precisa da ação print $ 0, pois isso está implícito se nenhuma ação for especificada.

Note que suponho que "grepping" signifique usar ferramentas Unix para filtrar um subconjunto desejado dos dados disponíveis.

O erro original provavelmente é devido a um espaço entre a data e a hora, para que o argumento -v receba apenas a data, enquanto a hora aparece como um argumento separado, confundindo o awk. Para resolver isso, use o formato %H em vez de %k (já que seu formato de registro é de dois dígitos) e remova o espaço entre o dia e a hora (como uma solução simplista para o problema). Então toda a solução se torna:

sed 's/\(..\)-\(..\)-\(..\)\(.*\)/--/' log |
awk -v date=$(date -d "30 minutes ago" +"%y-%m-%d%H:%M:%S") '$1$2 >= date'
    
por Jeffrey Ross 22.06.2017 / 09:43
0

Comando tudo em um awk , compatível com gawk , mawk e o POSIX awk spec :

$ awk -F '[- ]' -v target="$(date -d '30 minutes ago' +'%y-%m-%d %T')" '
    { time = sprintf("%02d-%02d-%02d %s", $3, $2, $1, $4) }
    time >= target
  ' log

Primeiro, estou invocando awk de uma maneira que aceita hífen e espaço como delimitadores, o que facilita a análise da data. A linha de comando awk também chama date para definir uma variável time no formato aa-mm-dd HH: MM: SS (da unidade mais significativa para a menor para que possa ser classificada).

A primeira linha em awk usa o mesmo formato de hora para definir a variável time para cada linha do log. A segunda linha então compara de forma asciótica o tempo da linha de registro com o tempo de destino. A ação padrão de awk é imprimir, então imprime a linha.

Usando "30 minutes ago" em relação à pergunta "22-06-17 06:43:40":

$ awk -F '[- ]' -v target="$(date -d '2017-06-22 06:13:40' +'%y-%m-%d %T')" '
    { time = sprintf("%02d-%02d-%02d %s", $3, $2, $1, $4) }
    time >= target
  ' log

22-06-17 06:40:51 ID-2
22-06-17 06:40:55 ID-7
22-06-17 06:40:16 ID-3
22-06-17 06:42:20 ID-2
    
por Adam Katz 18.09.2018 / 19:31