El tema de la jqnecesidad de un filtro explícito cuando la salida se redirige se discute en toda la web. Pero no puedo redirigir la salida si jqes 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 jqcomando es:
1
3
Pero si agrego algún tipo de redirección o tubería al final del jqcomando, 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_subThe 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 jqversió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 jqmi comprensión de las cadenas de tuberías?
tail -f logfile | grep 'foo bar' | awk ...
tailbit 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 -fpara proporcionar una entrada continua a un programa yteeprocesar la salida. Si todavía necesitara una respuesta, le habría sugerido que simplificara la cadena para<in.json jq '.f1' >out.jsonpoder reducir la causa.