Como usar o awk para ler dados entre todos os intervalos freqüentes

0

Eu tenho um arquivo de log no seguinte formato

[30/Jan/2015:10:10:30 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 425
[30/Jan/2015:10:11:00 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 261
[30/Jan/2015:10:11:29 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 232
[30/Jan/2015:10:12:00 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 315
[30/Jan/2015:10:12:29 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 221
[30/Jan/2015:10:12:57 +0000] 12.30.30.182 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 218

Cada linha neste arquivo de log tem tempo de resposta no último campo & tem timestamp no primeiro campo. Existe uma maneira em awk de ler o tempo médio de resposta em todos os intervalos específicos? Por exemplo, calculando o tempo médio de resposta a cada cinco minutos.

Eu tentei o seguinte caminho, que é a maneira estática de fazê-lo e dará apenas uma média de um intervalo de tempo.

$ grep "30/Jan/2015:10:1[0-4]" mylog.log | awk '{resp+=$NF;cnt++;}END{print "Avg:"int(resp/cnt)}'

Mas eu preciso fazer isso para todo o arquivo por todos os 5 minutos. Mesmo se eu repetir o comando, como posso passar a data dinamicamente para o comando? Porque o arquivo de log varia toda vez e as datas nele.

Ou existe alguma outra maneira alternativa de fazer isso além de awk ? Por favor sugira.

    
por svjn 03.02.2015 / 10:02

1 resposta

2

No primeiro fechamento, pode ser:

awk -F"[][ ]*" -v it=300 '{
    sub(":"," ",$2)
    gsub("/"," ",$2)
    "date +%s -d \""$2"\""|getline d
    if (d-f>it) {
        f=d
        if (NR!=1)
            print s/n 
        s=n=""
        }
    n++
    s+=$NF
    }' log.file
  • -F"[][ ]*" usado como F ields S eparator para remover os colchetes adicionalmente
  • Variável -v it=300 set (intervalo em segundos)
  • sub,gsub remove os símbolos do campo para prepará-lo para o formato de comando date
  • date converte campo em segundo (de EPOCH)
  • |getline d coloca acima na variável d
por 03.02.2015 / 10:58