Come usare `jq` in una pipeline di shell?


195

Non riesco jqa comportarmi "normalmente" in una pipeline di shell. Per esempio:

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

risulta jqsemplicemente stampando il testo della guida *. La stessa cosa succede se provo a reindirizzare jql'output su un file:

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

Sta jqdeliberatamente salvando se determina che non è gestito da un tty? Come posso prevenire questo comportamento in modo da poterlo utilizzare jqin una pipeline?


* (Mi rendo conto che questo esempio contiene un uso inutile di cat ; è solo a scopo illustrativo)

Risposte:


323

È necessario fornire un filtro come argomento. Per passare il JSON attraverso non modificato diverso da quello jqfornito dalla stampa di default, usa il filtro identità .:

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

23
L'ho lasciato perché l'OP lo aveva; Suppongo che sia solo un segnaposto per indicare che jqsta sia leggendo da una pipe che scrivendo su un'altra pipe. Se il desiderio è semplicemente vedere l'output di jq, allora catnon è necessario.
Chepner,

3
(1) jq versione 1.5 è stata migliorata in modo che il file. non è necessario in casi come questo. (2) Non è necessario citare il ".".
picco

6
@peak Potrebbe non essere necessario per una pipeline, ma ne ho 1.5 e ho dovuto fornire il "." per reindirizzare l'output su un file.
MHarris,

2
Cito l' .abitudine, dal momento che la mia pratica standard è prima di vedere come appare JSON, quindi tornare indietro e iniziare ad aggiungere al filtro, che molto spesso dovrà essere citato.
Chepner,

6
@WalterTross Sì, e ho spiegato in un commento 18 mesi fa perché lo cito.
Chepner,

15

Un caso d'uso che mi sono ritrovato a fare anche di frequente è "Come posso costruire dati JSON da fornire in altri comandi shell, per esempio curl?" Il modo in cui lo faccio è usando l' --null-input/-nopzione:

Non leggere alcun input! Al contrario, il filtro viene eseguito una volta utilizzando nullcome input. Ciò è utile quando si utilizza jqcome una semplice calcolatrice o per costruire dati JSON da zero.

E un esempio passandolo in curl:

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

9
È bello, ma non sei sicuro di quanto sia rilevante per questa domanda?
mgalgs,

2
@mgalgs Mi sono trovato a voler generare / utilizzare jqall'inizio di una pipeline di shell piuttosto che a metà / fine per filtrare alcuni dati. L' curlesempio è di base, ma mi sono ritrovato spesso a scrivere a mano i dati JSON curle cercare di ottenere un preventivo corretto, quindi ho pensato che potesse essere utile anche agli altri.
mkobit,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.