2

У меня есть файл журнала (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.

2 ответа2

1

Я предполагаю, что вы хотите количество записей за единицу времени (минут в вашем примере). Я не знаю, может ли gnuplot считать строки таким образом. Вместо этого я бы использовал awk (или любой другой удобный для вас язык) для накопления данных. Что-то вроде этого сделало бы:

script = '{time = $ 3; gsub(/:[0-9] [0-9] $/, "", время); date = sprintf("% s% s% s", $ 1, $ 2, время)} date == последняя {count++} дата!= последняя {печать даты, количество; кол = 0}»

pipe(файл) = sprintf("<awk '% s'% s", скрипт, файл), сюжетный канал ("pc1.log") title "PC1"

0

Ваш вопрос не очень явный. Как Ханнес, я предполагаю, что вы хотите построить график количества строк, соответствующих определенной дате.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .