Kwestia jqpotrzeby jawnego filtrowania podczas przekierowywania danych wyjściowych jest omawiana w Internecie. Ale nie jestem w stanie przekierować danych wyjściowych, jeśli jqjest częścią łańcucha potoków, nawet jeśli używany jest filtr jawny.
Rozważać:
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
Zgodnie z oczekiwaniami dane wyjściowe w oryginalnym terminalu z jqpolecenia to:
1
3
Ale jeśli dodam jakiekolwiek przekierowanie lub potokowanie na końcu jqpolecenia, dane wyjściowe zostaną wyciszone:
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
Brak danych wyjściowych w pierwszym terminalu i out.txt jest pusty.
Próbowałem setek odmian, ale jest to zagadka nieuchwytna. Jedynym obejściem, jakie znalazłem , jak odkryłem za pomocą mosquitto_subThe Things Network (w którym również odkryłem problem), jest zawinięcie funkcji tail i jq w skrypcie powłoki:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
Następnie:
./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
I rzeczywiście, pojawia się wynik:
1
3
Jest to najnowszy jqzainstalowany przez 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
Czy jest to (w dużej mierze nieudokumentowany) błąd w jqlub z moim rozumieniem łańcuchów rur?
tail -f logfile | grep 'foo bar' | awk ...
tailbit powstał z wysiłków mających na celu rozbicie potoku (uruchomienie pierwszego polecenia, tee i przekierowanie do pliku, zakończenie tego, potok do następnego polecenia, przekierowanie do pliku itp.) I ciągłe uruchamianie go w sekcjach. <Jest dobrym narzędziem, aby pamiętać jednak.
tail -fdo ciągłego wprowadzania danych do programu iteeprzetwarzania danych wyjściowych. Jeśli nadal potrzebujesz odpowiedzi, sugerowałbym uproszczenie łańcucha<in.json jq '.f1' >out.json, abyś mógł zawęzić jego przyczyny.