Bagaimana cara menggunakan `jq` dalam pipa shell?

195

Sepertinya saya tidak bisa jqberperilaku "normal" dalam pipa shell. Sebagai contoh:

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

hasil jqhanya dengan mencetak teks bantuannya *. Hal yang sama terjadi jika saya mencoba mengarahkan jqoutput ke file:

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

Apakah jqbail out sengaja jika menentukan bahwa itu tidak dijalankan dari tty? Bagaimana saya bisa mencegah perilaku ini sehingga saya bisa menggunakan jqpipa?


* (Saya menyadari contoh ini berisi penggunaan kucing yang tidak berguna ; hanya untuk ilustrasi)

mgalg
sumber

Jawaban:

323

Anda perlu menyediakan filter sebagai argumen. Untuk melewatkan JSON melalui yang tidak dimodifikasi selain dari yang jqdisediakan oleh pencetakan cantik secara default, gunakan filter identitas .:

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat
chepner
sumber
23
Saya meninggalkannya karena OP memilikinya; Saya menganggap itu hanya penampung untuk menunjukkan bahwa jqkeduanya membaca dari pipa dan menulis ke pipa lain. Jika keinginannya hanya melihat output jq, maka catitu sendiri tidak perlu.
chepner
3
(1) jq versi 1.5 telah ditingkatkan sehingga. tidak perlu dalam kasus seperti ini. (2) Tidak perlu mengutip "."
puncaknya
6
@peak Mungkin tidak perlu untuk saluran pipa, tapi saya punya 1,5 dan harus menyediakan "." untuk mengarahkan output ke file.
MHarris
2
Saya mengutip .kebiasaan itu, karena praktik standar saya adalah pertama-tama melihat seperti apa JSON itu, kemudian kembali dan mulai menambahkan ke filter, yang lebih sering perlu dikutip.
chepner
6
@WalterTross Ya, dan saya menjelaskan dalam komentar 18 bulan yang lalu mengapa saya mengutipnya.
chepner
15

Satu use case yang saya temukan sering saya lakukan juga adalah "Bagaimana cara membuat data JSON untuk memasok ke perintah shell lain, misalnya curl?" Cara saya melakukan ini adalah dengan menggunakan --null-input/-nopsi:

Jangan membaca input sama sekali! Sebagai gantinya, filter dijalankan sekali menggunakan nullsebagai input. Ini berguna saat digunakan jqsebagai kalkulator sederhana atau untuk membangun data JSON dari awal.

Dan sebuah contoh meneruskannya ke curl:

jq -n '{key: "value"}' | curl -d @- \
  --url 'https://some.url.com' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json'
mkobit
sumber
9
Itu keren, tapi tidak yakin bagaimana itu relevan dengan pertanyaan ini?
mgalgs
2
@ mgalgs Saya menemukan diri saya ingin menghasilkan / menggunakan jqpada awal pipa shell daripada di tengah / akhir untuk memfilter pada beberapa data. The curlcontoh adalah satu dasar, tapi saya menemukan diri saya mengetik sering bergandengan data JSON ke curldan berusaha untuk mengutip benar, jadi saya pikir mungkin berguna untuk orang lain juga.
mkobit