शेल पाइपलाइन में `jq` का उपयोग कैसे करें?


196

मुझे jqशेल पाइपलाइन में "सामान्य रूप से" व्यवहार करने के लिए प्रतीत नहीं हो सकता है । उदाहरण के लिए:

$ curl -s https://api.github.com/users/octocat/repos | jq | cat

jqकेवल इसके मदद पाठ को प्रिंट करने में परिणाम *। एक ही बात होती है अगर मैं jqएक फ़ाइल में आउटपुट पुनर्निर्देशित करने की कोशिश करता हूं :

$ curl -s https://api.github.com/users/octocat/repos | jq > /tmp/stuff.json

क्या jqजानबूझकर इसे खत्म किया जा रहा है अगर यह निर्धारित करता है कि यह एक ट्टी से नहीं चलाया जा रहा है? मैं इस व्यवहार को कैसे रोक सकता हूं ताकि मैं jqएक पाइपलाइन में उपयोग कर सकूं?


* (मुझे पता है कि इस उदाहरण में बिल्ली का बेकार उपयोग है ; यह केवल उदाहरण के लिए है)

जवाबों:


325

आपको एक तर्क के रूप में एक फिल्टर की आपूर्ति करने की आवश्यकता है। jqडिफ़ॉल्ट रूप से सुंदर मुद्रण प्रदान करता है के अलावा अन्य अनसनोड के माध्यम से JSON को पास करने के लिए, पहचान फ़िल्टर का उपयोग करें .:

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat

23
मैंने इसे छोड़ दिया क्योंकि ओपी के पास था; मुझे लगता है कि यह इंगित करने के लिए सिर्फ एक प्लेसहोल्डर है जो jqएक पाइप से पढ़ रहा है और दूसरे पाइप से लिख रहा है। यदि इच्छा केवल उत्पादन को देखना है jq, तो catस्वयं अनावश्यक है।
शेपनर

3
(1) jq संस्करण 1.5 को बढ़ाया गया है ताकि इस तरह के मामलों में अनावश्यक है। (२) "उद्धृत करने की कोई आवश्यकता नहीं है।"
शिखर

6
@ पीक यह एक पाइपलाइन के लिए आवश्यक नहीं हो सकता है, लेकिन मेरे पास 1.5 है और "प्रदान करना था।" किसी फ़ाइल में आउटपुट रीडायरेक्ट करने के लिए।
मैहरिस

2
मैं .आदत से बाहर निकलता हूं, क्योंकि मेरा मानक अभ्यास पहले यह देखना है कि JSON कैसा दिखता है, फिर वापस जाएं और फ़िल्टर में जोड़ना शुरू करें, जिसे अधिक बार उद्धृत करने की आवश्यकता नहीं होगी।
चेपनर

6
@WalterTross हां, और मैंने 18 महीने पहले एक टिप्पणी में बताया था कि मैं इसे क्यों उद्धृत करता हूं।
chepner

15

एक उपयोग का मामला जो मैंने खुद को अक्सर पाया है वह यह है कि "मैं JSON डेटा का निर्माण अन्य शेल कमांड में कैसे कर सकता हूं, उदाहरण के लिए curl?" जिस तरह से मैं यह --null-input/-nविकल्प का उपयोग करके है:

किसी भी इनपुट को बिल्कुल न पढ़ें! इसके बजाय, nullइनपुट के रूप में उपयोग करके एक बार फ़िल्टर चलाया जाता है। jqसाधारण कैलकुलेटर के रूप में उपयोग करते समय या स्क्रैच से JSON डेटा बनाने के लिए यह उपयोगी है ।

और इसमें एक उदाहरण दिया जा रहा है curl:

jq -n '{key: "value"}' | curl -d @- \
  --url 'https://some.url.com' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json'

9
यह अच्छा है, लेकिन निश्चित नहीं है कि यह इस प्रश्न के लिए कैसे प्रासंगिक है?
मंगल

2
@ मैगल्स ने पाया कि मैं खुद jqको कुछ डेटा के लिए फ़िल्टरिंग के लिए मध्य / अंत के बजाय शेल पाइपलाइन की शुरुआत में उत्पन्न / उपयोग करना चाहता था । curlउदाहरण के एक बुनियादी एक है, लेकिन मैं करने के लिए अपने आप को JSON डेटा में अक्सर हाथ टाइपिंग पाया curlऔर सही के हवाले करने की कोशिश कर, इसलिए मैंने सोचा कि यह अच्छी तरह से दूसरों के लिए उपयोगी हो सकता है।
mkobit
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.