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
पहले टर्मिनल में कोई आउटपुट नहीं दिखाई देता है और बाहर की जगह खाली है।
मैंने सैकड़ों रूपांतरों की कोशिश की है लेकिन यह एक मायावी मुद्दा है। एकमात्र वर्कअराउंड मैंने पाया है , जैसा कि थ्रू mosquitto_sub
नेटवर्क और थिंग्स नेटवर्क के माध्यम से खोजा गया था (जो कि मैंने इस मुद्दे को भी खोजा था), एक शेल स्क्रिप्ट में टेल और जेक फ़ंक्शन को लपेटना है :
#!/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
आउटपुट को संसाधित करने के लिए। यदि आपको अभी भी उत्तर की आवश्यकता है, तो मैंने श्रृंखला को सरल बनाने का सुझाव दिया होगा<in.json jq '.f1' >out.json
ताकि आप इसे कम कर सकें कि यह क्या कारण है।