gnuplot で時間データをプロットする

gnuplot で時間データをプロットする

関係のない行が削除されたログ ファイル (auth.log) があります。時間/日ごとに行を集計してプロットに表示したいのですが、つまり、同じ時間または日内の各行がプロットの 1 つの目盛りに集計されるということです。

関数を調べていますが、行き詰まってしまいます。

これまでのところはこれですが、ログ ファイルの各行に「変数」がある場合にのみ機能します。

#!/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 つのエントリは 2 の 1 つのティックになり、11:26:xx の 3 つのエントリは 3 の 1 つのティックになります。

答え1

時間単位 (この例では分) ごとのエントリ数を知りたいのだと思います。gnuplot がこのように行数をカウントできるかどうかはわかりません。awk代わりに (または、あなたにとって便利な言語) を使用してデータを累積します。次のようになります。

script = '{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}'

pipe(file) = sprintf("< awk '%s' %s", スクリプト, ファイル) plot pipe("pc1.log") title "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

関連情報