Trazar datos de tiempo en gnuplot

Trazar datos de tiempo en gnuplot

Tengo un archivo de registro (auth.log) donde se eliminaron las líneas no relevantes. Deseo agregar líneas por hora/día en el gráfico, lo que significa que cada línea que esté dentro de la misma hora o día se agrega en un tic del gráfico.

He estado investigando funciones, pero sigo atascado.

Esto es lo que tengo hasta ahora, pero sólo funcionará si tengo una "variable" para cada línea en el archivo de registro.

#!/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"

A continuación se muestra un ejemplo de los datos.

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

En este caso las dos entradas a las 19:21:xx serán un tic de 2 y las tres a las 11:26:xx serán un tic de 3.

Respuesta1

Supongo que desea el recuento de entradas por unidad de tiempo (minutos en su ejemplo). No sé si gnuplot puede contar líneas de esta manera. En su lugar , usaría awk(o cualquier idioma que le resulte conveniente) para acumular los datos. Algo como esto haría:

script = '{tiempo = $3; gsub(/:[0-9][0-9]$/, "", hora); fecha=sprintf("%s %s %s", $1, $2, hora)} fecha==última{cuenta++} fecha!=última{imprimir fecha, cuenta; recuento=0}'

pipe(archivo) = sprintf("< awk '%s' %s", script, archivo) plot pipe("pc1.log") título "PC1"

Respuesta2

Tu pregunta no es muy explícita. Como Hannes, supongo que quieres trazar el número de líneas correspondientes a una fecha determinada.

Gnuplot no es adecuado para esto; se recomienda preprocesar el archivo.

Sin embargo, con gnuplot 3.4 o posterior puedes programar contadores (como variables globales), por lo que podrías tener algo como esto:

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 solo para archivos ordenados (agregará entradas consecutivas, no no consecutivas), currentxdebe contener el primer valor (o necesita insertar más pruebas). Para las fechas necesitarás adaptar un poco el guión.

Puedes probarlo, por ejemplo, con un archivo generado por gnuplot como este:

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

información relacionada