El tema de la jq
necesidad de un filtro explícito cuando la salida se redirige se discute en toda la web. Pero no puedo redirigir la salida si jq
es parte de una cadena de tuberías, incluso cuando se usa un filtro explícito.
Considerar:
touch in.txt
tail -f in.txt | jq '.f1'
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
Como se esperaba, la salida en el terminal original del jq
comando es:
1
3
Pero si agrego algún tipo de redirección o tubería al final del jq
comando, la salida se silencia:
rm in.txt
touch in.txt
tail -f in.txt | jq '.f1' | tee out.txt
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
No aparece ninguna salida en el primer terminal y out.txt está vacío.
He probado cientos de variaciones pero es un problema difícil de alcanzar. La única solución que he encontrado , como descubrí a través de mosquitto_sub
The Things Network (que también descubrí el problema), es envolver las funciones tail y jq en un script de shell:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
Luego:
./tail_and_jq.sh | tee out.txt
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
Y, efectivamente, aparece la salida:
1
3
Esto es con la última jq
versión instalada a través de Homebrew:
$ echo $SHELL
/bin/bash
$ jq --version
jq-1.5
$ brew install jq
Warning: jq 1.5_3 is already installed and up-to-date
¿Es esto un error (en gran parte indocumentado) en jq
mi comprensión de las cadenas de tuberías?
tail -f logfile | grep 'foo bar' | awk ...
tail
bit surgió de los esfuerzos por romper la tubería (ejecute el primer comando, coloque en T y redirija al archivo, siga esa cola, canalice al siguiente comando, redirija al archivo, etc.) y ejecútelo continuamente en secciones. Sin <
embargo, es una buena herramienta para tener en cuenta.
tail -f
para proporcionar una entrada continua a un programa ytee
procesar la salida. Si todavía necesitara una respuesta, le habría sugerido que simplificara la cadena para<in.json jq '.f1' >out.json
poder reducir la causa.