[英]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.