letra - script gnuplot
¿Cómo trazar datos sin un archivo separado especificando todos los puntos dentro de la secuencia de comandos Gnuplot? (4)
Mi programa genera scripts de bash que llaman gnuplot. No quiero tener que hacer un archivo extra para almacenar los datos; ¿Hay alguna manera en que pueda llamar explícitamente a todos los valores? O posiblemente tener a bash hacer un archivo temporal.
Algo como
plot {(1,5),(2,10),(3,1)}
es lo que estoy buscando.
bash una línea de ping gráfico con gnuplot
Lo sentimos, no es luz (361 caracteres):
gnuplot -p -e "set xdata time;set timefmt ''%s'';set xrange [ ''$(date +%s)'' : ''$(date -d ''now +30 seconds'' +%s)'' ];plot ''-'' using 1:2 with line title ''ping google'';" < <(( ping -c 30 -n google.com| sed -u ''s/^64.*time=/([0-9.]/+/) .*$//1/p;d'' | tee >(sed -u ''s/.*/now/''| stdbuf -oL date -f - +d%s)) | sed -u ''N;s//n/ /;s//([0-9.]/+/) d/([0-9]/+/) *//2 /1/;s/d//'')
La ejecución de esta línea mantendrá su terminal durante 30 segundos, luego de trazar en pantalla un gráfico que presenta el retraso de ping a google.com en los últimos 30 segundos.
La misma línea podría dividirse de esta manera (también es factible):
gnuplot -p -e "
set xdata time;
set timefmt ''%s'';
set xrange [ ''$(
date +%s
)'' : ''$(
date -d ''now +30 seconds'' +%s
)'' ];
plot ''-'' using 1:2 with line title ''ping google'';
" < <((
ping -c 30 -n google.com |
sed -u ''s/^64.*time=/([0-9.]/+/) .*$//1/p;d'' |
tee >(sed -u ''s/.*/now/''| stdbuf -oL date -f - +d%s)) |
sed -u ''N;s//n/ /;s//([0-9.]/+/) d/([0-9]/+/) *//2 /1/;s/d//''
)
¡Pero esto no imprime valores!
Así que he añadido algunos bytes:
gnuplot -p -e "set xdata time;set timefmt ''%s'';set xrange [ ''$(date +%s)'' : ''$(date -d ''now +30 seconds'' +%s)'' ];plot ''-'' using 1:2 with line title ''ping google'';" < <(( ping -c 30 -n google.com| sed -u ''s/^64.*time=/([0-9.]/+/) .*$//1/p;d'' | tee >(sed -u ''s/.*/now/''| stdbuf -oL date -f - +d%s) ) | sed -u ''N;s//n/ /;s//([0-9.]/+/) d/([0-9]/+/) *//2 /1/;s/d//'' | tee >(printf "%(%T)T %s/n" $(</dev/stdin) | column -c $COLUMNS >&2 ))
Esto puede crear una ventana como esta:
E imprimir simultáneamente en el terminal:
17:58:53 19.6 17:59:00 124 17:59:07 159 17:59:13 194 17:59:19 17.1
17:58:54 18.7 17:59:02 19.4 17:59:08 20.3 17:59:14 16.8 17:59:20 20.0
17:58:55 17.9 17:59:03 180 17:59:09 76.4 17:59:15 48.9 17:59:21 192
17:58:57 115 17:59:04 186 17:59:10 226 17:59:16 221 17:59:22 17.1
17:58:58 18.5 17:59:05 16.8 17:59:11 109 17:59:17 19.0
17:58:59 17.0 17:59:06 184 17:59:12 18.8 17:59:18 18.7
Reescrito dividido:
gnuplot -p -e "
set xdata time;
set timefmt ''%s'';
set xrange [ ''$(date +%s)'' : ''$(date -d ''now +30 seconds'' +%s)'' ];
plot ''-'' using 1:2 with line title ''ping google'';" < <(
(
ping -c 30 -n google.com |
sed -u ''s/^64.*time=/([0-9.]/+/) .*$//1/p;d'' |
tee >(sed -u ''s/.*/now/''| stdbuf -oL date -f - +d%s)
) | sed -u ''N;s//n/ /;s//([0-9.]/+/) d/([0-9]/+/) *//2 /1/;s/d//'' |
tee >(printf "%(%T)T %s/n" $(</dev/stdin) |
column -c $COLUMNS >&2 )
)
Ejemplo de uso de shell con pipeline,
gnuplot -p <(echo -e ''plot "-"/n1 1/ne'')
Puede utilizar la sintaxis para los datos en línea - nombre ''-''
archivo ''-''
.
El siguiente ejemplo produce un gráfico simple en una imagen GIF
(script bash
):
gnuplot << EOF
set terminal gif
set output ''plot1.gif''
plot ''-'' using 1:2
1 10
2 20
3 32
4 40
5 50
e
EOF
Los bloques de datos de Gnuplot 5.0.1 funcionan bien para eso:
$data << EOD
1 5
2 10
3 1
EOD
plot "$data"
Este método es un poco más versátil que ''-''
ya que facilita la reutilización de los mismos datos varias veces, incluido el mismo comando de plot
: https://.com/a/33064402/895245
La versión 5 está disponible en Ubuntu 15.04, o compilar desde la fuente con: https://askubuntu.com/a/684136/52975
También puede interesarle los nombres de archivo especiales +
y ++
al trazar con funciones.