Masalah jq
memerlukan filter eksplisit ketika output diarahkan kembali dibahas di seluruh web. Tapi saya tidak dapat mengarahkan output jika jq
merupakan bagian dari rantai pipa, bahkan ketika filter eksplisit sedang digunakan.
Mempertimbangkan:
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
Seperti yang diharapkan, output di terminal asli dari jq
perintah adalah:
1
3
Tetapi jika saya menambahkan segala jenis pengalihan atau pemipaan ke akhir jq
perintah, hasilnya menjadi sunyi:
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
Tidak ada output yang muncul di terminal pertama dan out.txt kosong.
Saya sudah mencoba ratusan variasi tetapi ini masalah yang sulit dipahami. Satu-satunya solusi yang saya temukan , seperti yang ditemukan melalui mosquitto_sub
dan The Things Network (yang merupakan tempat saya juga menemukan masalah), adalah untuk membungkus fungsi ekor dan jq dalam skrip shell:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
Kemudian:
./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
Dan benar saja, output muncul:
1
3
Ini dengan yang terbaru jq
diinstal melalui 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
Apakah ini bug (sebagian besar tidak berdokumen) di jq
atau dengan pemahaman saya tentang rantai pipa?
tail -f logfile | grep 'foo bar' | awk ...
tail
bit muncul dari upaya untuk memecah pipa (jalankan perintah pertama, tee dan redirect ke file, ekor itu, pipa ke perintah berikutnya, redirect ke file, dll) dan jalankan terus menerus dalam beberapa bagian. Ini <
adalah alat yang baik untuk diingat.
tail -f
untuk memberikan input terus menerus ke suatu program dantee
untuk memproses output. Jika Anda masih membutuhkan jawaban, saya akan menyarankan untuk menyederhanakan rantai<in.json jq '.f1' >out.json
sehingga Anda dapat mempersempit apa yang menyebabkannya.