如何在Shell管道中使用`jq`?


194

我似乎无法jq在Shell管道中表现为“正常”。例如:

$ 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无用用法;仅用于说明目的)

Answers:


322

您需要提供一个过滤器作为参数。要通过jq默认情况下漂亮的打印方式以外的其他方式传递JSON ,请使用标识过滤器.

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

23
我把它留在里面是因为OP有它。我认为这只是一个占位符,表示这jq既是从管道读取又是写入另一个管道。如果只希望看到的输出jq,那么cat它本身是不必要的。
chepner 2015年

3
(1)jq 1.5版已得到增强,因此。在这种情况下是不必要的。(2)无需引用“。”。
达到峰值

6
@peak可能不需要管道,但是我有1.5,并且必须提供“”。将输出重定向到文件。
MHarris '16

2
我引用这种.习惯是不习惯的,因为我的标准做法是先查看JSON的外观,然后返回并开始添加到过滤器中,而过滤器通常需要被引用。
chepner '16

6
@WalterTross是的,我在18个月前的评论中解释了为什么引用它。
chepner

15

我发现自己经常做的一个用例是“例如,如何构造JSON数据以提供给其他Shell命令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在shell管道的开始而不是在中间/结尾生成/使用以过滤某些数据。该curl示例是一个基本示例,但是我发现自己经常手动将JSON数据输入curl并试图正确引用,因此我认为它对其他人也可能有用。
mkobit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.