La question d' jq
avoir besoin d'un filtre explicite lorsque la sortie est redirigée est discutée partout sur le Web. Mais je ne peux pas rediriger la sortie si elle jq
fait partie d'une chaîne de canalisations, même lorsqu'un filtre explicite est utilisé.
Considérer:
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
Comme prévu, la sortie dans le terminal d'origine de la jq
commande est:
1
3
Mais si j'ajoute une sorte de redirection ou de tuyauterie à la fin de la jq
commande, la sortie devient silencieuse:
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
Aucune sortie n'apparaît dans le premier terminal et out.txt est vide.
J'ai essayé des centaines de variantes mais c'est un problème difficile à cerner. La seule solution de contournement que j'ai trouvée , telle que découverte par le biais de mosquitto_sub
The Things Network (où j'ai également découvert le problème), est d'envelopper les fonctions tail et jq dans un script shell:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
Alors:
./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
Et bien sûr, la sortie apparaît:
1
3
C'est avec la dernière version jq
installée via 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
Est-ce un bug (largement non documenté) dans jq
ou avec ma compréhension des chaînes de tuyaux?
tail -f logfile | grep 'foo bar' | awk ...
tail
bit est né des efforts pour casser le tuyau (exécutez la première commande, tee et rediriger vers le fichier, queue que, tuyau vers la commande suivante, rediriger vers le fichier, etc.) et l'exécuter en continu dans les sections. C'est <
un bon outil à garder à l'esprit.
tail -f
pour fournir une entrée continue à un programme ettee
pour traiter la sortie. Si vous aviez encore besoin d'une réponse, j'aurais suggéré de simplifier la chaîne pour<in.json jq '.f1' >out.json
que vous puissiez affiner la cause.