这将是一个简短的基于示例的指南,用于(a)awk(b)gnuplot和(c)在脚本中使用它们。
我需要根据两次运行的命令输出绘制一些数据图。因此,解决该五分钟任务的最佳方法是比花一个小时学习awk& gnuplot可以自动化吗?
我需要比较一个程序说需要多长时间和实际执行需要多长时间。因此,我想运行几次,并生成真实时间与报告时间的图表。
为此,我们可以使用time命令检索其&real。时间。我的programalready打印(到stdout)它说完成所需的时间。输出看起来像" Time = x&#34 ;,其中x是一些十进制数字。我将在稍后描述时间输出。我希望脚本生成的最终表应如下所示(这些只是随机数):
Awk是一种围绕模式和动作的文本处理语言。模式就像正则表达式(例如hello或hello +,如果您想要一个或多个'字符)一样,动作只是语句列表(例如{print 1;})。所有模式都针对每一行进行检查,如果有匹配项,则会执行相应的操作。
这是一个示例,如果输入的某些行包含hello,则使用awk打印1:
我使用zsh的时间与bash格式略有不同。另外,两者都输出到stderr,因此您会注意到2& 1,它将stderr重定向到stdout。
我们将需要变量(例如for循环的索引)来打印试用号。没问题,我们可以使用-voption初始化awk -v j = 1 [script](将j设置为1)。
我们也可以要求awk给我们当前行中的第n个单词$ n,其中n是一些整数。
#"时间"将出现在" java"之前在我的输出中(例如" Time ... \ n java ... \ n Time ... \ n ...")。 #另外,substr用来删除'来自时间的输出字符-vj = 1' / Time / {printf("%d%s&#34 ;, j ++,$ 3)} / java / {printf(" %s \ n",substr($ 5,1,length($ 5)-1))}'
我将详细说明。我的程序可以像time ./java arg1 arg2 2& 1一样运行,它将产生2行输出,第一行包含" Time = [integer]&#34 ;,第二行包含时间的输出。因此,我的awk脚本将看到" Time&#34 ;,它将在其中打印索引和整数,或者在看到" java"之后将打印实时信息。请注意,我没有使用" Time"打印换行符动作(将首先出现在我的输出中)。因此,我可以根据跨越多行(在这种情况下为2行)的数据构建一行。此外,我的输出中没有包含同时包含" Time"的行。和" java"。
当我的程序运行五次并将输出通过管道传递到该awk命令时,它将产生如下数据:
要绘制数据,我们可以有两条线。一个将使用第二列作为y轴,另一个将使用第三列。两者均在其x轴1上使用第一列(试验编号)。
告诉gnuplot使用两列:使用1:2或u 1:2指定列1在x轴上,列2在y上。要绘制一条线,请使用p&data.dat&p34; u 1:2标题"我的情节" w lp(w lp表示使其成为线图),但是我们需要两条线,并且在没有gnuplot交互模式的情况下也要使用它,因此请使用完整的命令:
#data.dat是我的文件名,约定似乎以* .dat.SETUP_OUTPUT ="设置终端png大小500,500结尾; 设置输出' blogplot.png' PLOT_DATA =" p' data.dat' u 1:2标题' Real Time' w lp,&#39.data.dat' u 1:3标题'印刷时间' w lp" gnuplot -e" $ SETUP_OUTPUT $ PLOT_DATA" 1试用号并没有真正的意义。 在这种情况下,此图不是特别有用。 但这不是有关统计信息的帖子。