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

时间:2015-10-20 21:35:52

标签: shell pipe jq

我似乎无法让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

* (我知道此示例包含useless use of cat;仅供参考)

2 个答案:

答案 0 :(得分:278)

您需要提供过滤器作为参数。要通过未经修改的JSON而不是默认提供的漂亮打印jq,请使用标识过滤器.

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

答案 1 :(得分:9)

我发现自己经常做的一个用例是“如何构建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'