在 gnuplot 中绘制时间数据

在 gnuplot 中绘制时间数据

我有一个日志文件 (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 的一个 tic,而 11:26:xx 处有三个条目将为 3 的一个 tic。

答案1

我假设您想要每个时间单位(在您的示例中为分钟)的条目数。我不知道 gnuplot 是否可以以这种方式计算行数。我会使用awk(或任何对您方便的语言)来累积数据。类似这样的操作可以做到:

脚本 = '{time = $3; gsub(/:[0-9][0-9]$/, "", time); date=sprintf("%s %s %s", $1, $2, time)} date==last{count++} date!=last{print date, count; count=0}'

管道(文件)= sprintf(“<awk'%s'%s”,脚本,文件)图管道(“pc1.log”)标题“PC1”

答案2

你的问题不太明确。和 Hannes 一样,我假设你想绘制与某个日期对应的行数。

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

相关内容