
У меня есть файл журнала (auth.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"
Вот пример данных
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
В этом случае две записи в 19:21:xx будут представлять собой один тик 2, а три записи в 11:26:xx будут представлять собой тик 3.
решение1
Я предполагаю, что вы хотите получить количество записей за единицу времени (в вашем примере — за минуты). Я не знаю, может ли gnuplot подсчитывать строки таким образом. Я бы использовал awk
(или любой другой удобный для вас язык) для накопления данных вместо этого. Подойдет что-то вроде этого:
скрипт = '{время = $3; gsub(/:[0-9][0-9]$/, "", время); дата=sprintf("%s %s %s", $1, $2, время)} дата==last{count++} дата!=last{печать дату, count; count=0}'
pipe(файл) = sprintf("< awk '%s' %s", скрипт, файл) plot pipe("pc1.log") title "PC1"
решение2
Ваш вопрос не очень ясен. Как Ханнес, я предполагаю, что вы хотите построить график количества линий, соответствующих определенной дате.
Gnuplot не очень хорошо подходит для этого, рекомендуется предварительная обработка файла.
Однако в gnuplot 3.4 и более поздних версиях вы можете программировать счетчики (как глобальные переменные), поэтому у вас может получиться что-то вроде этого:
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
Работает только для отсортированных файлов (добавляет последовательные записи, а не непоследовательные), currentx
должен содержать первое значение (или нужно вставить больше тестов). Для дат нужно будет немного адаптировать скрипт.
Вы можете проверить это, например, с помощью файла, сгенерированного gnuplot, например, так:
set table "file.gdat"
set parametric
plot [0:20] floor(exp(t/10)),t
unset table