[英]How can I use gnuplot with awk in shell command line (-e swtich)
我想在 shell 命令行中使用带有awk
gnuplot
,如下所示。
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 中绘制它。
从 Gnuplot 文档:
命令行替换由用反引号括起来的系统命令指定。 生成此命令,它产生的输出替换命令行上的反引号文本
来源: GnuPlot 5.0 文档
所以这可以很容易地在 gnuplot 本身中进行测试:
gnuplot> `awk 'BEGIN{print "plot sin(x)"}'`
如果您现在想在命令行中将它与-e
标志一起使用,它应该如下所示:
$ gnuplot --persist -e "`awk 'BEGIN{print \"plot sin(x)\"}' ` "
请注意,我们必须对 awk 命令中的 <double-quotes> 进行转义。 这是由于 bash 引用规则。 如果您不想转义双引号,则必须使用单引号并再次转义它们。 这将看起来像这样:
$ gnuplot --persist -e '`awk '"'"'BEGIN{print "plot sin(x)"}'"'"' ` '
如果你只是使用awk
来生成数据并且你想使用 gnuplot 的管道系统:
在具有 popen 函数的系统上,数据文件可以通过 shell 命令通过以“<”开头的文件名进行管道传输。 例如,
pop(x) = 103*exp(-x/10) plot "< awk '{print $1-1965, $2}' population.dat", pop(x)
来源: GnuPlot 5.0 文档
因此,在 OP 的情况下,通过正确的转义,您可以执行以下操作:
$ gnuplot --persist -e "plot \"< awk '/matchpattern/{print \$4}' log.txt \""
请注意我还必须如何转义$
,否则,bash 会将其替换为第 4 个 bash 参数,这很可能是一个空字符串。
您只需要转义嵌套的双引号:
gnuplot -persist -e "plot \" < awk '/matchpattern/ {print $4}' log.txt \" "
如果你不这样做,你的 shell 将解释为 gnuplot 的单独参数
-e "plot "
< awk
'/matchpattern/ {print $4}'
log.txt
并且 shell 会错误地认为它应该从名为awk
的文件重定向gnuplot
命令的标准输入。 由于该文件在您的工作目录中不存在,它会引发错误: awk: No such file or directory.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.