Zeitdaten in Gnuplot plotten

Zeitdaten in Gnuplot plotten

Ich habe eine Protokolldatei (auth.log), aus der nicht relevante Zeilen entfernt wurden. Ich möchte Zeilen pro Stunde/Tag im Diagramm aggregieren, was bedeutet, dass jede Zeile, die innerhalb derselben Stunde oder desselben Tages liegt, in einem Tick im Diagramm aggregiert wird.

Ich habe mir die Funktionen angesehen, aber ich stecke immer wieder fest.

Das ist, was ich bisher habe, aber es funktioniert nur, wenn ich für jede Zeile in der Protokolldatei eine „Variable“ habe.

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

Hier ist ein Beispiel der Daten

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

In diesem Fall ergeben die beiden Einträge um 19:21:xx einen Tic von 2 und die drei um 11:26:xx einen Tic von 3.

Antwort1

Ich nehme an, Sie möchten die Anzahl der Einträge pro Zeiteinheit (Minuten in Ihrem Beispiel). Ich weiß nicht, ob gnuplot Zeilen auf diese Weise zählen kann. Ich würde awkstattdessen (oder eine beliebige für Sie geeignete Sprache) verwenden, um die Daten zu kumulieren. So etwas würde funktionieren:

Skript = '{Zeit = $3; gsub(/:[0-9][0-9]$/, "", Zeit); Datum=sprintf("%s %s %s", $1, $2, Zeit)} Datum==letztes{Anzahl++} Datum!=letztes{Druckdatum, Anzahl; Anzahl=0}'

pipe(Datei) = sprintf("< awk '%s' %s", Skript, Datei) Plot pipe("pc1.log") Titel "PC1"

Antwort2

Deine Frage ist nicht sehr eindeutig. Wie Hannes gehe ich davon aus, dass du die Anzahl der Zeilen darstellen möchtest, die einem bestimmten Datum entsprechen.

Gnuplot ist hierfür nicht gut geeignet, eine Vorverarbeitung der Datei wird empfohlen.

Mit Gnuplot 3.4 oder höher können Sie jedoch Zähler (als globale Variablen) programmieren, sodass Sie etwa Folgendes erhalten könnten:

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

Funktioniert nur bei sortierten Dateien (es werden aufeinanderfolgende Einträge hinzugefügt, keine nicht aufeinanderfolgenden) und currentxmuss den ersten Wert enthalten (oder Sie müssen weitere Tests einfügen). Für Datumsangaben müssen Sie das Skript ein wenig anpassen.

Sie können es beispielsweise mit einer von Gnuplot generierten Datei wie dieser testen:

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

verwandte Informationen