Kwestia jq
potrzeby jawnego filtrowania podczas przekierowywania danych wyjściowych jest omawiana w Internecie. Ale nie jestem w stanie przekierować danych wyjściowych, jeśli jq
jest 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 jq
polecenia to:
1
3
Ale jeśli dodam jakiekolwiek przekierowanie lub potokowanie na końcu jq
polecenia, 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_sub
The 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 jq
zainstalowany 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 jq
lub z moim rozumieniem łańcuchów rur?
tail -f logfile | grep 'foo bar' | awk ...
tail
bit 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 -f
do ciągłego wprowadzania danych do programu itee
przetwarzania 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.