2015-10-20 18 views
87

Non riesco a ottenere il jq comportamento "normale" in una pipeline di shell. Per esempio:Come usare `jq` in una pipeline di shell?

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

risultati in jq semplicemente stampare il testo di aiuto *. La stessa cosa accade se provo a reindirizzare l'output jq 's in un file:

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

Is jq deliberatamente salvataggio se determina che non è in esecuzione da un terminale? Come posso evitare questo comportamento in modo da poter utilizzare jq in una pipeline?


* (mi rendo conto questo esempio contiene una useless use of cat: è solo a scopo illustrativo)

risposta

158

È necessario fornire un filtro come argomento. Per passare il JSON attraverso modificato diverso da quello piuttosto stampa jq fornisce di default, utilizzare il filtro identità .:

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

Perché il tubo a "gatto"? È davvero necessario? –

+15

L'ho lasciato perché l'OP ce l'aveva; Presumo che sia solo un segnaposto per indicare che 'jq' sta entrambi leggendo da una pipe e scrivendo su un'altra pipe. Se il desiderio è semplicemente vedere l'output di 'jq', quindi' cat' non è necessario. – chepner

+3

(1) jq versione 1.5 è stato migliorato in modo che il file. non è necessario in casi come questo. (2) Non è necessario citare il ".". – peak

3

Un uso caso mi sono trovato a fare spesso così è "Come faccio a Construct Data JSON per fornire in altri comandi della shell, ad esempio curl? " Il mio modo di fare questo è quello di utilizzare l'opzione --null-input/-n:

Non leggere alcun input a tutti! Invece, il filtro viene eseguito una volta utilizzando null come input. Ciò è utile quando si utilizza jq come semplice calcolatrice o per costruire dati JSON da zero.

E un esempio di passaggio in curl:

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

È bello, ma non sono sicuro di come sia rilevante per questa domanda? – mgalgs

+1

@mgalgs Mi sono ritrovato a voler generare/utilizzare 'jq' all'inizio di una pipeline di shell piuttosto che a metà/fine per filtrare su alcuni dati.L'esempio di 'curl' è di base, ma mi sono trovato spesso a digitare a mano i dati JSON su' curl' e cercando di ottenere quoting right, quindi ho pensato che potesse essere utile anche agli altri. – mkobit

Problemi correlati