我有一个日志文件 (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