问题描述
最近了解了一个很好用的工具,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数据。
正文完