Como usar o `jq` em um pipeline de shell?

195

Parece que não consigo me jqcomportar "normalmente" em um pipeline de shell. Por exemplo:

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

resulta na jqsimples impressão do texto de ajuda *. O mesmo acontece se eu tentar redirecionar jqa saída para um arquivo:

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

Está jqsaindo deliberadamente se determinar que não está sendo executado a partir de um tty? Como posso evitar esse comportamento para poder usar jqem um pipeline?


* (Eu sei que este exemplo contém um uso inútil de gato ; é apenas para fins ilustrativos)

mgalgs
fonte

Respostas:

323

Você precisa fornecer um filtro como argumento. Para passar o JSON por outra modificação que a impressão bonita não jqfornece por padrão, use o filtro de identidade .:

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat
chepner
fonte
23
Deixei porque o OP tinha; Suponho que seja apenas um espaço reservado para indicar que jqé a leitura de um pipe e a gravação em outro pipe. Se o desejo é simplesmente ver a saída de jq, então catele é desnecessário.
Chepner # 21/15
3
(1) A versão 1.5 do jq foi aprimorada para que o. é desnecessário em casos como este. (2) Não há necessidade de citar o ".".
pico
6
@peak Pode não ser necessário para um pipeline, mas eu tenho 1,5 e precisei fornecer o "." para redirecionar a saída para um arquivo.
MHarris
2
Cito o .hábito, já que minha prática padrão é primeiro ver como é o JSON, depois voltar e começar a adicionar ao filtro, que mais frequentemente precisará ser citado.
chepner
6
@WalterTross Sim, e expliquei em um comentário há 18 meses por que cito.
chepner
15

Um caso de uso que me vi frequentemente: "Como construo dados JSON para fornecer em outros comandos do shell, por exemplo curl?" A maneira como faço isso é usando a --null-input/-nopção:

Não leia nenhuma entrada! Em vez disso, o filtro é executado uma vez usando nullcomo entrada. Isso é útil ao usar jqcomo uma calculadora simples ou para construir dados JSON do zero.

E um exemplo passando para curl:

jq -n '{key: "value"}' | curl -d @- \
  --url 'https://some.url.com' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json'
mkobit
fonte
9
Isso é legal, mas não tem certeza de como é relevante para esta pergunta?
mgalgs
2
@mgalgs Eu me vi querendo gerar / usar jqno início de um pipeline de shell em vez de no meio / final para filtrar alguns dados. O curlexemplo é básico, mas eu me encontrei frequentemente digitando manualmente dados JSON curle tentando fazer a citação correta, então pensei que poderia ser útil para outras pessoas também.
Mkobit