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

mga*_*lgs 185 shell pipe jq

我似乎无法jq在shell管道中"正常"行事.例如:

$ curl -s https://api.github.com/users/octocat/repos | jq | cat
Run Code Online (Sandbox Code Playgroud)

结果在jq简单的打印出它的帮助文本*.如果我尝试将jq输出重定向到文件,会发生同样的事情:

$ curl -s https://api.github.com/users/octocat/repos | jq > /tmp/stuff.json
Run Code Online (Sandbox Code Playgroud)

jq如果它确定它不是从tty运行的话,是故意拯救?如何防止此行为以便我可以jq在管道中使用?


*(我意识到这个例子包含了无用用途 ;它仅用于说明目的)

che*_*ner 305

您需要提供过滤器作为参数.要通过未经修改的JSON传递jq,默认情况下提供漂亮的打印,请使用标识过滤器.:

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat
Run Code Online (Sandbox Code Playgroud)

  • 因为OP有它,我把它留了下来; 我假设它只是一个占位符来表示`jq`是从管道读取并写入另一个管道.如果希望简单地看到`jq`的输出,那么`cat`本身是不必要的. (22认同)
  • @peak管道可能没有必要,但我有1.5并且必须提供"." 将输出重定向到文件. (6认同)
  • @WalterTross是的,我在18个月前的评论中解释了为什么我引用它. (6认同)
  • (1)jq 1.5版本已经增强了.在这种情况下是不必要的.(2)无需引用".". (3认同)
  • 我引用了`.`的习惯,因为我的标准做法是首先看看JSON的样子,然后回去开始添加到过滤器,这通常需要引用. (2认同)

mko*_*bit 13

我发现自己经常做的一个用例是"我如何构造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'
Run Code Online (Sandbox Code Playgroud)

  • 这很酷,但不确定它与这个问题有什么关系? (8认同)
  • @mgalgs我发现自己想在shell管道的开始而不是在中间/结尾生成/使用`jq`来过滤某些数据。“ curl”示例是一个基本示例,但我发现自己经常手动将JSON数据输入到“ curl”中并尝试正确引用,因此我认为这对其他人也可能有用。 (2认同)