Як використовувати `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в трубопроводі?


* (Я усвідомлюю, що цей приклад містить марне використання кота ; це лише для ілюстрації)

Відповіді:


327

Вам потрібно надати фільтр як аргумент. Щоб передати JSON через немодифіковану, за винятком симпатичного друку, jqпередбаченого за замовчуванням, використовуйте фільтр ідентичності .:

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

23
Я залишив це, тому що в ОП це було; Я припускаю, що це просто заповнювач, щоб вказати, що jqце і читання з труби, і запис в іншу трубку. Якщо бажання просто побачити вихід jq, то catсаме по собі це зайве.
чепнер

3
(1) jq версія 1.5 була вдосконалена, так що. є непотрібним у таких випадках. (2) Не потрібно цитувати ".".
пік

6
@peak Можливо, це не потрібно для трубопроводу, але у мене 1,5 і довелося надати "." щоб перенаправити вихід у файл.
MHarris

2
Я цитую за .звичкою, оскільки моя стандартна практика полягає в тому, щоб спочатку подивитися, як виглядає JSON, а потім повернутися назад і почати додавати у фільтр, що найчастіше потрібно буде цитувати.
чепнер

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'

9
Це круто, але не впевнений, наскільки це стосується цього питання?
mgalgs

2
@mgalgs Мені здалося, що я хочу створити / використовувати jqна початку конвеєра оболонки, а не в середині / кінці для фільтрації вниз по деяких даних. curlПриклад є одним з основних один, але я виявив , часто ручне введення даних в форматі JSON , щоб curlі намагається отримати право цитувати, так що я думав , що це може бути корисним для інших.
mkobit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.