【发布时间】:2013-10-14 10:05:27
【问题描述】:
我想创建一个 Perl(或 Bash)脚本来即时创建和绘制数据。这意味着我想从日志文件 file.log 中提取数据,理想情况下不要编写 tmp 文件(如果只能使用 tmp 文件,这也可以)和用 Gnuplot 绘图。随着日志文件的增长,我想在图中看到更多信息。
类似话题请见this question。
对于 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。我试过了,但它不适合我。
第二个问题是将数据读入数组 @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 并保存它,即时部分将起作用。
【问题讨论】:
-
嗯...好吧,您将
@grepped数组打印到gnuplot 在向其中添加任何数据....?你期望它如何工作? -
你当然是对的。这不是真正完整的代码,无法工作。我也尝试嵌套两个
open但这对我也不起作用。 -
-persist是正确的,但你必须告诉gnuplot从stdin和plot '-' u 2:1读取。输入流必须以e结束。 -
@bashophil 好吧,您知道在将数组插入字符串时,元素之间用空格分隔(或者更确切地说,是
$"中包含的值)?所以如果@grepped = (1,2,3);,那么"@grepped"将是1 2 3。 -
抱歉,
e仅用于终止内联数据(请参阅this answer。但您必须以其他方式终止输入流,然后才能绘制它:seq 1 5 | gnuplot -e "plot '-'" -persist。唐不知道如何在 PERL 中进行管理。
标签: perl bash gnuplot on-the-fly