Perl (または Bash) スクリプトを作成して、オンザフライでデータを作成およびプロットしたいと考えています。つまり、ログファイルfile.logからデータを抽出したいということです。理想的には、tmp ファイルを書き込まず (tmp ファイルでのみ可能であれば、これも問題ありません)、Gnuplot でプロットします。ログファイルが大きくなるにつれて、プロットに追加情報を表示したいと考えています。
同様のトピックについては、この質問を参照してください。
Perl の場合、これまでのところ、次のスクリプトがあります。
#!/usr/bin/perl
use strict;
use warnings;
my $path = "file.log";
my @grepped;
my $switch = "off";
open(INFILE,"< $path") or die $! \n";
while (my $line = <INFILE>) {
if ($line =~ m{^Time = (\d+)}){
push(@grepped,"$1\t");
};
if ($line =~ m{^Errors: local = (\d+), global = (\d+)}){
push(@grepped,"$1\t");
push(@grepped,"$2\n");
$switch = "refresh";
};
if ($switch eq "refresh"){
open(GP, "| gnuplot -persist") or die: $! \n";
print GP << "GNU_EOF";
plot "@grepped" u 2:1
pause 1; refresh; reread;
GNU_EOF
close(GP);
}
}
close(INFILE)};
私の最初の問題は、Gnuplot のオンザフライ機能が機能していないことです。file.logが変更されると、Gnuplot-graph の更新が機能しません。-persist
ここで が正しいかどうか、またはreplot
の代わりにオプションを使用する必要があるかどうかはわかりませんrefresh
。試してみましたが、うまくいきません。
2 番目の問題は、データを配列@greppedに読み込み、 Gnuplot で入力ファイルを変更するための 1 つのスクリプトで使用することです。追加の制限の 1 つは、(コードからわかるように) @greppedに完全な新しい行が書き込まれた場合にのみ、gnuplot がプロットを更新する必要があることです。そうしないと、データの割り当てが間違っているため、確実にエラーが発生します。
次のような単純なスクリプトを試すと、
#!/usr/bin/gnuplot -persist
plot "data.dat" u 2:1
pause 1; replot; reread;
また
#!/usr/bin/gnuplot
plot "data.dat" u 2:1
pause 1; refresh; reread;
data.dat
手で変更して保存すると、オンザフライ部分が機能します。