jq
Çıktı yeniden yönlendirildiğinde açık bir filtreye ihtiyaç duyulması sorunu tüm web üzerinde tartışılmaktadır. Ancak jq
, açık bir filtre kullanılıyor olsa bile, bir boru zincirinin parçasıysa çıktıyı yeniden yönlendiremiyorum .
Düşünmek:
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
Beklendiği gibi, orijinal terminaldeki jq
komuttan çıkış :
1
3
Ancak, jq
komutun sonuna herhangi bir yönlendirme veya borulama eklersem , çıktı sessiz kalır :
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
İlk uçbirimde çıkış görünmüyor ve out.txt boş.
Yüzlerce varyasyonu denedim ama bu zor bir konu. Bulduğum gibi bulduğum tek geçici çözümmosquitto_sub
ve (bu da sorunu keşfettiğim şey) The Things Network, kuyruk ve jq işlevlerini bir kabuk komut dosyasına sarmaktır:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
Sonra:
./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
Ve yeterince emin olun, çıktı görünür:
1
3
jq
Homebrew üzerinden en son yüklenen budur:
$ echo $SHELL
/bin/bash
$ jq --version
jq-1.5
$ brew install jq
Warning: jq 1.5_3 is already installed and up-to-date
Bu jq
, boru zincirlerini anladığımda veya benim bildiğimde (büyük ölçüde belgelenmemiş) bir hata mı?
tail -f logfile | grep 'foo bar' | awk ...
tail
bit, boruyu parçalama çabalarından kaynaklandı (ilk komutu çalıştır, dosyaya yönlendir ve yönlendir, kuyruk, sonraki komuta boru, dosyaya yönlendir, vb.) Ve bölümlerde sürekli olarak çalıştır. <
Gerçi akılda tutmak iyi bir araçtır.
tail -f
bir programa sürekli girdi sağlamaktee
ve çıktıyı işlemek için oldukça (iyi, biraz) garip bir kurulumunuz var . Hâlâ bir cevaba ihtiyacınız olsaydı,<in.json jq '.f1' >out.json
neyin sebep olduğunu daraltabilmeniz için zinciri basitleştirmeyi önerirdim .