Plotando timedata no gnuplot

2

Eu tenho um arquivo de log (auth.log) onde as linhas não relevantes foram removidas. Desejo agregar linhas por hora / dia na plotagem, o que significa que cada linha que está na mesma hora ou dia é agregada em um tique na plotagem.

Eu tenho procurado por funções, mas continuo ficando preso.

Isto é o que tenho até agora, mas só funcionará se eu tiver uma "variável" para cada linha no arquivo de log.

#!/usr/bin/env gnuplot                                                          

set terminal png size 1200,800                                                  
set output "graph.png"                                                          
set title "Breakin Attempts"                                                    

set key top right box                                                           
set style data lines                                                            
set border 3                                                                    
set grid                                                                        
set pointsize 3                                                                 

set xlabel "Number of breakin attempts"                                         
set xtics nomirror                                                              
set xdata time                                                                  
set timefmt "%b %d %H:%M:%S"                                                    
set format x "%m/%d"                                                            

set ylabel "Time"                                                               
set ytics nomirror                                                              

plot "pc1.log" using 1:4 title "PC1" linecolor rgb "red", \                                                  
     "pc2.log" using 1:4 title "PC2" linecolor rgb "blue", \            
     "pc3.log" using 1:4 title "PC3" linecolor rgb "green"

Aqui está um exemplo dos dados

Sep 18 11:26:30 root 60.191.36.196                                              
Sep 18 11:26:34 root 60.191.36.196                                              
Sep 18 11:26:37 root 60.191.36.196
Sep 18 19:21:31 root 198.56.193.74                                              
Sep 18 19:21:33 root 198.56.193.74

Neste caso, as duas entradas em 19: 21: xx serão um tic de 2 e as três em 11: 26: xx serão um tic de 3.

    
por Mogget 04.10.2013 / 01:13

2 respostas

1

Suponho que você queira a contagem de entradas por unidade de tempo (minutos no seu exemplo). Eu não sei se o gnuplot pode contar linhas dessa maneira. Eu usaria awk (ou qualquer idioma conveniente para você) para acumular os dados. Algo assim faria:

script = '{time = $3; gsub(/:[0-9][0-9]$/, "", time); date=sprintf("%s %s %s", $1, $2, time)} date==last{count++} date!=last{print date, count; count=0}'

pipe(file) = sprintf("< awk '%s' %s", script, file) plot pipe("pc1.log") title "PC1"

    
por 25.08.2015 / 11:45
0

Sua pergunta não é muito explícita. Como Hannes, presumo que você queira plotar o número de linhas correspondentes a uma determinada data.

O Gnuplot não é adequado para isso, o pré-processamento do arquivo é recomendado.

No entanto, com o gnuplot 3.4 ou posterior você pode programar contadores (como variáveis globais), então você pode ter algo assim:

currentx=1/0
currentn=0
increaseandreturn(returnvalue)=(currentn=currentn+1,returnvalue)
startnewxandreturn(x,returnvalue)=(currentx=x,currentn=0,returnvalue)
count(x)=((x==currentx)?increaseandreturn(1/0):startnewxandreturn(x,currentn))
plot "file.gdat" using ($1-1):(count($1)) with points

Funciona apenas para arquivos ordenados (adicionará entradas consecutivas, não não consecutivas), currentx precisa conter o primeiro valor (ou você precisa inserir mais testes). Para datas, você precisará adaptar o sript um pouco.

Você pode testá-lo, por exemplo, com um arquivo gerado pelo gnuplot assim:

set table "file.gdat"
set parametric
plot [0:20] floor(exp(t/10)),t
unset table
    
por 03.11.2015 / 16:15