จะใช้ `jq 'ใน shell shell ได้อย่างไร?


198

ดูเหมือนว่าฉันจะไม่สามารถ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การประกันตัวโดยจงใจหากพิจารณาว่าไม่ได้เรียกใช้จาก tty หรือไม่? ฉันจะป้องกันพฤติกรรมนี้เพื่อให้สามารถใช้jqในขั้นตอนการทำงานได้อย่างไร


* (ฉันรู้ว่าตัวอย่างนี้มีการใช้แมวที่ไร้ประโยชน์มันเป็นเพียงภาพประกอบเท่านั้น)

คำตอบ:


327

คุณต้องระบุตัวกรองเป็นอาร์กิวเมนต์ ในการส่งต่อ JSON ผ่านทางที่ไม่ได้แก้ไขนอกเหนือจากการjqจัดพิมพ์สวย ๆโดยค่าเริ่มต้นให้ใช้ตัวกรองข้อมูลประจำตัว.:

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

23
ฉันทิ้งไว้เพราะ OP มี ฉันถือว่าเป็นตัวยึดตำแหน่งเพื่อระบุว่าjqทั้งการอ่านจากไพพ์และการเขียนไปยังไพพ์อื่น หากปรารถนาก็คือการเห็นผลลัพธ์ของjqแล้วcatตัวเองเป็นที่ไม่จำเป็น
chepner

3
(1) jq เวอร์ชั่น 1.5 ได้รับการปรับปรุงเพื่อให้ ไม่จำเป็นในกรณีเช่นนี้ (2) ไม่จำเป็นต้องอ้าง "."
สูงสุด

6
@peak อาจไม่จำเป็นสำหรับไพพ์ไลน์ แต่ฉันมี 1.5 และต้องระบุ "." เพื่อเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์
MHarris

2
ฉันอ้างถึง.นิสัยเนื่องจากการปฏิบัติมาตรฐานของฉันคือการดูครั้งแรกที่ JSON ดูเหมือนว่าจากนั้นกลับไปและเริ่มเพิ่มตัวกรองซึ่งมักจะไม่จำเป็นต้องยกมา
chepner

6
@WalterTross ใช่และฉันอธิบายในความคิดเห็น 18 เดือนที่ผ่านมาทำไมฉันพูดมัน
chepner

16

กรณีใช้งานหนึ่งที่ฉันพบว่าตัวเองกำลังทำบ่อยๆเช่นกันคือ"ฉันจะสร้างข้อมูล 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
เยี่ยมมาก แต่ไม่แน่ใจว่าเกี่ยวข้องกับคำถามนี้อย่างไร
mgalgs

2
@mgalgs ฉันพบว่าตัวเองต้องการสร้าง / ใช้jqที่จุดเริ่มต้นของเชลล์ไปป์ไลน์แทนที่จะอยู่ตรงกลาง / สิ้นสุดเพื่อกรองข้อมูลบางอย่าง curlตัวอย่างเป็นหนึ่งในขั้นพื้นฐาน แต่ฉันพบตัวเองบ่อยพิมพ์มือในข้อมูล JSON เพื่อcurlและพยายามที่จะได้รับการอ้างสิทธิดังนั้นฉันคิดว่ามันอาจจะเป็นประโยชน์กับผู้อื่นได้เป็นอย่างดี
mkobit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.