如何在Shell命令行(-e swtich)中将gnuplot与awk一起使用

时间:2019-03-27 01:47:51

标签: linux shell awk gnuplot

我想在外壳命令行中将gnuplotawk一起使用,如下所示。

gnuplot -persist -e " plot '< awk_command' "

我的awk命令是

awk '/match_pattern/ {print $4}' log.txt

我在awk命令中找不到如何处理引号。

gnuplot -persist -e "plot " < awk '/matchpattern/ {print $4}' log.txt " "

这产生了一条错误消息

awk: No such file or directory.

当我在gnuplot中进行此操作时,没有问题。

gnuplot> plot " < awk '/matchpattern/ {print $4}' log.txt "

为了方便起见,我想在shell命令行中而不是在gnuplot中绘制它。

2 个答案:

答案 0 :(得分:1)

从Gnuplot文档中:

  

命令行替换由反引号内的系统命令指定。该命令是   产生并产生的输出替换命令行上反引号的文本

     

来源:GnuPlot 5.0 documentation

因此,可以在gnuplot本身中轻松对其进行测试:

gnuplot> `awk 'BEGIN{print "plot sin(x)"}'`

如果您现在想在命令行中将其与-e标志一起使用,它应该看起来像这样:

$ gnuplot --persist -e "`awk 'BEGIN{print \"plot sin(x)\"}' ` "

请注意,我们必须在awk命令中转义。这是由于bash引用规则。如果不想转义双引号,则必须使用单引号并再次转义。那会看起来像这样:

$ gnuplot --persist -e '`awk '"'"'BEGIN{print "plot sin(x)"}'"'"' ` '

如果仅使用awk来生成数据,而您想使用gnuplot的管道系统:

  

在具有popen功能的系统上,可以通过启动shell命令通过shell命令来传递数据文件   名称带有“ <”。例如,

pop(x) = 103*exp(-x/10)
plot "< awk '{print $1-1965, $2}' population.dat", pop(x)
     

来源:GnuPlot 5.0 documentation

因此,如果是OP,请使用适当的转义符进行操作:

$ gnuplot --persist -e "plot \"< awk '/matchpattern/{print \$4}' log.txt \""

请注意我还必须转义$的情况,否则bash会将其替换为第4个bash参数,该参数很可能是空字符串。

答案 1 :(得分:0)

您只需要转义嵌套的双引号即可:

gnuplot -persist -e "plot \" < awk '/matchpattern/ {print $4}' log.txt \" "

如果不这样做,您的外壳程序将被解释为gnuplot的单独参数

  • -e "plot "
  • < awk
  • '/matchpattern/ {print $4}'
  • log.txt

并且shell会错误地认为应该从名为gnuplot的文件中重定向awk命令的标准输入。由于该文件在您的工作目录中不存在,因此会引发错误:awk: No such file or directory.