
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 awk
stattdessen (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 currentx
muss 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