ปัญหาของการjq
ต้องการตัวกรองที่ชัดเจนเมื่อมีการกล่าวถึงผลลัพธ์ของการเปลี่ยนเส้นทางไปทั่วเว็บ แต่ฉันไม่สามารถเปลี่ยนเส้นทางผลลัพธ์หากjq
เป็นส่วนหนึ่งของไพพ์เชนแม้ว่าจะใช้ตัวกรองอย่างชัดเจนก็ตาม
พิจารณา:
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
ตามที่คาดไว้เอาต์พุตในเทอร์มินัลดั้งเดิมจากjq
คำสั่งคือ:
1
3
แต่ถ้าฉันเพิ่มการเปลี่ยนเส้นทางหรือการวางท่อใด ๆ ที่ส่วนท้ายของjq
คำสั่งเอาต์พุตจะเงียบ
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
ไม่มีผลลัพธ์ปรากฏในเทอร์มินัลแรกและ out.txt ว่างเปล่า
ฉันลองหลายร้อยรูปแบบแล้ว แต่มันเป็นปัญหาที่เข้าใจยาก วิธีแก้ปัญหาเดียวที่ฉันค้นพบตามที่ค้นพบmosquitto_sub
และ The Things Network (ซึ่งเป็นที่ที่ฉันค้นพบปัญหา) คือการห่อฟังก์ชันtail และ jq ในเชลล์สคริปต์:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
แล้ว:
./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
และผลลัพธ์ก็จะปรากฏขึ้น:
1
3
นี่คือการjq
ติดตั้งล่าสุดผ่าน 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
นี่เป็นข้อผิดพลาด (ส่วนใหญ่ที่ไม่มีเอกสาร) jq
หรือด้วยความเข้าใจของฉันเกี่ยวกับโซ่ท่อหรือไม่?
tail -f logfile | grep 'foo bar' | awk ...
tail
บิตมาจากความพยายามที่จะทำลายไพพ์ลง (เรียกใช้คำสั่งแรกทีและเปลี่ยนเส้นทางไปยังไฟล์หางที่ไพพ์ไปยังคำสั่งถัดไปเปลี่ยนเส้นทางไปยังไฟล์ ฯลฯ ) และเรียกใช้อย่างต่อเนื่องในส่วน <
เป็นเครื่องมือที่ดีที่จะเก็บไว้ในใจว่า
tail -f
เพื่อใช้ป้อนข้อมูลอย่างต่อเนื่องไปยังโปรแกรมและtee
ประมวลผลเอาต์พุต หากคุณยังต้องการคำตอบฉันจะแนะนำให้ทำ chain ให้ง่ายขึ้น<in.json jq '.f1' >out.json
เพื่อที่คุณจะได้ จำกัด สิ่งที่ทำให้มันแคบลง