2015-10-20 155 views
87

我似乎无法让jq在shell管道中表现“正常”。例如:如何在shell管道中使用`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故意想逃出来,如果它决定了它没有被从终端方式运行?如何防止这种行为,以便我可以在管道中使用jq


* (我知道这个例子中含有useless use of cat;它是仅用于说明目的)

回答

158

您需要提供一个过滤器作为参数。要通过未修改其他通过JSON比漂亮的印刷jq默认提供,使用身份过滤.

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

为什么管 “猫”?它真的有必要吗? –

+15

因为OP有它,所以我把它留下了;我认为这只是一个占位符,表示'jq'既是从管道读取数据,又是写入另一个管道。如果愿望只是看到'jq'的输出,那么'cat'本身是不必要的。 – chepner

+3

(1)jq版本1.5已被增强,在这种情况下是不必要的。 (2)没有必要引用“。”。 – peak

3

的一种使用情况下,我发现自己经常这样做,以及为“如何构建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' 
+4

这很酷,但不确定它与这个问题有什么关系? – mgalgs

+1

@mgalgs我发现自己希望在shell管道的开始处生成/使用'jq',而不是在中间/结尾处过滤掉某些数据。'curl'的例子是一个基本的例子,但我发现自己经常用手将JSON数据输入到'curl'并试图引用正确,所以我认为它可能对其他人有用。 – mkobit