shell处理json字符串

shell中pretty print json

今天遇到个问题,就是打接口返回的结果是个json对象,但是直接打印出来是没有格式的,是整一行的。于是想起了之前使用的jq命令,试了一下不仅可以格式化,还有高亮效果!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"logs": [
{
"files": [
{
"url": "http://1234",
"start_time": "2017-08-24-0000",
"end_time": "2017-08-24-2359",
"size": 103281
},
{
"url": "http://12345b",
"start_time": "2017-08-24-0000",
"end_time": "2017-08-24-2359",
"size": 172777
},
{
"url": "http://1234",
"start_time": "2017-08-24-0000",
"end_time": "2017-08-24-2359",
"size": 247
}
],
"domain": "124"
}
]
}
1
echo $json | jq .

除此之外得益于风骚而飘逸的python还有一种方法,如下同样可以格式化但是并没有高亮:

1
echo $json | python -m json.tool

shell中json取值

上面提到的jq不仅可以用于格式化还可以用于打印json中的某些字段例如我想去除json中的url字段的值

1
2
echo $json | jq .logs[].files[].url
#在.后面直接跟要取的元素例如上面这个表示取key为logs的元素,同时其对应的元素为数组所以跟了[]默认表示取所有数组,如果里面有数字则取第几个,.后面跟key表示取key值

额外提一句

1
2
3
jq -r
#上面那种取法取url会带有""双引号,加上-r会打印纯字符串,例如不加-r直接将取值用于wget下载文件会报错 Scheme missing,原因是wget并不能识别"http这种协议🤣
#With this option, if the filter´s result is a string then it will be written directly to standard output rather than being formatted as a JSON string with quotes. This can be useful for making jq filters talk to non-JSON-based systems.