*파일을 사용하지 않고 bash 변수(숫자 데이터 목록)를 gnuplot에 전달하는 방법*

*파일을 사용하지 않고 bash 변수(숫자 데이터 목록)를 gnuplot에 전달하는 방법*

저는 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 차트를 만들려는 모든 사람에게 이것이 도움이 되기를 바랍니다!

관련 정보