Das Problem, jq
dass ein expliziter Filter erforderlich ist, wenn die Ausgabe umgeleitet wird, wird im gesamten Web behandelt. Ich kann die Ausgabe jedoch nicht umleiten, wenn sie jq
Teil einer Pipe-Kette ist, selbst wenn ein expliziter Filter verwendet wird.
Erwägen:
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
Wie erwartet jq
lautet die Ausgabe des Befehls im ursprünglichen Terminal :
1
3
Wenn ich am Ende des jq
Befehls eine Umleitung oder ein Piping hinzufüge , wird die Ausgabe stumm geschaltet:
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
Im ersten Terminal wird keine Ausgabe angezeigt und out.txt ist leer.
Ich habe Hunderte von Variationen ausprobiert, aber es ist ein schwer fassbares Problem. Die einzige Problemumgehung habe ich festgestellt , wie entdeckt durch mosquitto_sub
und die Dinge Network (das war , wo ich auch das Problem entdeckt), ist die Schwanz zu wickeln und jq Funktionen in einem Shell - Skript:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
Dann:
./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
Und sicher erscheint die Ausgabe:
1
3
Dies ist mit der neuesten jq
Version von Homebrew installiert:
$ echo $SHELL
/bin/bash
$ jq --version
jq-1.5
$ brew install jq
Warning: jq 1.5_3 is already installed and up-to-date
Ist dies ein (größtenteils undokumentierter) Fehler in jq
oder mit meinem Verständnis von Rohrketten?
tail -f logfile | grep 'foo bar' | awk ...
tail
Bit ist aus dem Versuch entstanden, die Pipe abzubrechen (den ersten Befehl ausführen, tee und in die Datei umleiten, tailen, zum nächsten Befehl umleiten, in die Datei umleiten usw.) und kontinuierlich in Abschnitten auszuführen. Dies <
ist jedoch ein gutes Werkzeug, das Sie im Hinterkopf behalten sollten.
tail -f
, um einem Programm fortlaufende Eingaben zu geben undtee
die Ausgabe zu verarbeiten. Wenn Sie noch eine Antwort benötigen, hätte ich vorgeschlagen, die Kette zu vereinfachen,<in.json jq '.f1' >out.json
damit Sie eingrenzen können, was die Ursache ist.