我想创建一个 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
option 而不是refresh
. 我试过了,但它不适合我。
第二个问题是将数据读入数组@grepped并在一个脚本中的 Gnuplot 中使用它来更改输入文件。另一个限制是(从代码中可以看出)gnuplot 仅应在@grepped中写入完整的新行时刷新绘图。否则,由于数据分配错误,肯定会发生错误。
当我尝试一个简单的脚本时:
#!/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
如果我手动更改并保存它,即时部分就可以工作。