
Eu tenho um arquivo de log (auth.log) onde linhas não relevantes foram removidas. Desejo agregar linhas por hora/dia no gráfico, o que significa que cada linha que está na mesma hora ou dia é agregada em um tique no gráfico.
Tenho pesquisado funções, mas continuo ficando preso.
Isto é o que tenho até agora, mas só funcionará se eu tiver uma "variável" para cada linha do 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 tique de 2 e as três em 11:26:xx serão um tique de 3.
Responder1
Presumo que você queira a contagem de entradas por unidade de tempo (minutos no seu exemplo). Não sei se o gnuplot pode contar linhas dessa maneira. Eu usaria awk
(ou qualquer linguagem conveniente para você) para acumular os dados. Algo assim faria:
script = '{tempo = $3; gsub(/:[0-9][0-9]$/, "", hora); data=sprintf("%s %s %s", $1, $2, hora)} data==última{contagem++} data!=última{data de impressão, contagem; contagem=0}'
pipe(arquivo) = sprintf("< awk '%s' %s", script, arquivo) plot pipe("pc1.log") título "PC1"
Responder2
Sua pergunta não é muito explícita. Como Hannes, presumo que você queira traçar o número de linhas correspondentes a uma determinada data.
O Gnuplot não é adequado para isso, recomenda-se o pré-processamento do arquivo.
No entanto, com o gnuplot 3.4 ou posterior você pode programar contadores (como variáveis globais), então você poderia 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
deve conter o primeiro valor (ou será necessário inserir mais testes). Para datas você precisará adaptar um pouco o roteiro.
Você pode testá-lo, por exemplo, com um arquivo gerado pelo gnuplot como este:
set table "file.gdat"
set parametric
plot [0:20] floor(exp(t/10)),t
unset table