
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), currentx
debe 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