Как использовать `jq` в конвейере оболочки?

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в конвейере?


* (Я понимаю, что этот пример содержит бесполезное использование cat ; это только для иллюстрации)

mgalgs
источник

Ответы:

328

Вы должны предоставить фильтр в качестве аргумента. Чтобы передать JSON через немодифицированные файлы, отличные от jqпредоставляемых по умолчанию «симпатичной печати », используйте фильтр идентификации .:

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat
chepner
источник
23
Я оставил это, потому что у ОП было это; Я предполагаю, что это просто заполнитель, чтобы указать, что jqи чтение из канала и запись в другой канал. Если желание просто увидеть результат jq, то catсамо по себе не является необходимым.
chepner
3
(1) JQ версии 1.5 была улучшена, так что. не требуется в таких случаях, как это. (2) Нет необходимости цитировать "."
пик
6
@peak Это может быть необязательным для конвейера, но у меня есть 1.5, и я должен был предоставить "." перенаправить вывод в файл.
MHarris
2
Я цитирую .по привычке, поскольку моя стандартная практика - сначала посмотреть, как выглядит JSON, затем вернуться и начать добавлять в фильтр, который чаще всего нужно будет заключать в кавычки.
chepner
6
@WalterTross Да, и я объяснил в комментарии 18 месяцев назад, почему я цитирую это.
Чепнер
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'
mkobit
источник
9
Это круто, но не уверен, насколько это актуально для этого вопроса?
mgalgs
2
@mgalgs Я хотел создать / использовать jqв начале конвейера оболочки, а не в середине / конце для фильтрации некоторых данных. Этот curlпример является базовым, но мне часто приходилось вручную набирать данные JSON curlи пытаться получить правильные цитаты, поэтому я подумал, что это может быть полезно и другим.
Мкобит