如何将jq的输出结果传递给其他命令

100次阅读
没有评论

问题描述

最近了解了一个很好用的工具,jq,可以将未格式化的JSON输出导入其中,然后将该输出重新格式化并以非常漂亮的彩色JSON布局输出到屏幕上。例如:

echo '{"value": "New", "onclick": "CreateNewDoc()"}' | jq

但是用户发现,他无法将经过jq格式化后的结果传递给他标准工具集中的其他工具,比如grep、sed、awk等。他想知道如何使得这种输出可以继续被传递给其他命令,例如以下的操作并不起作用:

'{"value": "New", "onclick": "CreateNewDoc()"}' | jq | grep value

解决方案

请注意以下操作注意版本差异及修改前做好备份。

使用jq过滤器解决问题

问题的关键在于jq的用法,jq需要一个过滤器来处理JSON数据。如果不提供过滤器,jq会尝试将命令行的其余部分作为过滤器解析,并抛出错误。以下是解决问题的两种方式:

方案1:使用空过滤器

为了解决这个问题,可以使用一个空过滤器'.',它会简单地将JSON内容美化输出。这并不是jq的最佳用法,但可以解决传递问题:

echo '{"value": "New", "onclick": "CreateNewDoc()"}' | jq '.' | grep value

方案2:指定属性过滤器

如果希望只获取某个特定属性的值,可以在过滤器中指定该属性。例如,如果要获取”value”属性的值,可以这样操作:

echo '{"value": "New", "onclick": "CreateNewDoc()"}' | jq '.value'

方案3:获取无引号字符串输出

如果希望输出的值不包含引号,可以使用-r选项来指示jq输出原始字符串,而不是JSON文本。示例如下:

echo '{"value": "New", "onclick": "CreateNewDoc()"}' | jq -r '.value'

jq --help中可以看到-r选项的解释:

-r     output raw strings, not JSON texts;

这是对jq的一个简单介绍,可能不能完全解决你的问题,因为你没有具体说明问题的细节,所以我不能提供更多的帮助。但希望这些简单的示例能够帮助你更好地使用jq来处理JSON数据。

正文完