私はgnuplotでプロットしたい一連の点を取得するためにnetcatを使用しています。しかし、最初にファイルに書き込まずにデータをgnuplotに渡すのに問題があります。
最も簡単な場合は、まず次のように変数で定義された3点線を描きたいと思います。
#!/bin/bash
DATA="10
12
15"
echo "$DATA"
# Data looks good in terminal (single vertical column of numbers 10, 12, 15)
# However, the following step doesn't work:
gnuplot -persist <<-EOFMarker
plot $DATA w lines
EOFMarker
実際のユースケースは、ネットワークで接続されたRigolオシロスコープからデータを取得してグラフ化することです。これまでの完全なスクリプトは次のとおりです。
#!/bin/bash
SERVER=192.168.0.12
PORT=5555
RIGOLDATA="$(echo ":TRAC:DATA? TRACE1" | netcat -q1 $SERVER $PORT | cut -c 13- | tr ',' '\n' | tr -d [:blank:])"
echo "$RIGOLDATA"
# RigolData looks good in terminal (single vertical column of numbers).
# However, the following does not work:
gnuplot -persist <<-EOFMarker
plot $RIGOLDATA w lines
EOFMarker
次のように、最初にデータを一時ファイルに渡すと、目的の結果が得られますが、一時ファイルを使用しないようにします。
#!/bin/bash
SERVER=192.168.0.12
PORT=5555
RIGOLDATA="$(echo ":TRAC:DATA? TRACE1" | netcat -q1 $SERVER $PORT | cut -c 13- | tr ',' '\n' | tr -d [:blank:])"
echo "$RIGOLDATA" > tempfile.csv
gnuplot -persist <<-EOFMarker
plot "tempfile.csv" w lines
EOFMarker
答え1
plot $DATA w lines
次に展開
plot 10
12
15 w lines
つまり、$DATA
含まれているすべての項目は文字通りそこに配置されます(改行文字など)。これによりコマンドが中断される可能性があります。 (gnuplotにコマンドラインから直接データを提供する方法があるかどうかはわかりませんが、plot
他の形式が必要な場合があります。)
シェルにはコマンド出力を「ファイル」にインポートしてファイル名に拡張するプロセス置換機能がありますが、stdinを介してデータを渡し、コマンドをオプションplot
として提供することをお勧めします。gnuplot
使用されるコマンド例に基づいてここ、次のように動作します。
echo "$DATA" | gnuplot -e 'plot "-" w lines'
または、まずシェルからデータを収集せずに、データをインポートした場所から直接データを転送します。
echo ":TRAC:DATA? TRACE1" | netcat -q1 "$SERVER" "$PORT" |
cut -c 13- | tr ',' '\n' | tr -d "[:blank:]" |
gnuplot -e 'plot "-" w lines'
もしそうなら、一時ファイルを使用することはそれほど悪くないと思います。多くのシェルスクリプトはそれを使用し、非シェルプログラムもそれを使用します。通常、シェルスクリプトから呼び出される多くのプログラムはファイルを直接読み取ることができますが、シェル変数からデータを渡すにはより複雑でなければなりません。 (たとえば、パイプはecho "$var" | somecmd
データを書き込むために追加のシェルコピーを実行する必要がありますが、ここのドキュメントとここの文字列はバックsomecmd <<< "$var"
グラウンドで一時ファイルを生成できます...)
もちろん、通常、作業が終わったら、すべての一時ファイルを削除したいと考え、競合が発生しないように、そのファイルが一意の名前で作成されていることを確認する必要があります。しかし、これは難しくありません:
#!/bin/bash
server=192.168.0.12
port=5555
tempfile=$(mktemp)
echo ":TRAC:DATA? TRACE1" | netcat -q1 "$server" "$port" |
cut -c 13- | tr ',' '\n' | tr -d "[:blank:]" > "$tempfile"
gnuplot -persist <<-EOFMarker
plot "$tempfile" w lines
EOFMarker
rm -f -- "$tempfile"
答え2
さて、私が考えた簡単な答え、Feedgnuplotをインストールして使用する方法を共有したいと思います。
これにより、Y座標4、8、5、7を結ぶ単純な線が描画されます。
echo -e "4\n8\n5\n7" | feedgnuplot -w lines
これにより、(x、y)点(3,11)、(4,15)、(5,12)を結ぶ単純な線が描画されます。
echo -e "3 11\n4 15\n5 12" | feedgnuplot -w lines --domain
--streamオプションを使用して、リアルタイムビューグラフのプロットを頻繁に再描画することもできます。
これが基本的に私が探しているものです。 Rigol DSA815用の信頼性が高く迅速に更新されるbashスクリプトでは、Feedgnuplotを次のように正常に使用しています。
while true; do
printf "clear\n"
echo ":TRAC:DATA? TRACE1" | netcat -N 192.168.0.12 5555 | cut -c 13- | tr ',' '\n' | tr -d [:blank:]
printf "replot\n"
done | feedgnuplot --with 'lines lw 3' --stream 0 --exit --xlen 601
一時ファイルを使用せずにgnuplotチャートを作成したい人にこれが役立つことを願っています!