jq简介
jq可以对json数据进行分片、过滤、映射和转换,和sed、awk、grep等命令一样,都可以让你轻松地把玩文本。它能轻松地把你拥有的数据转换成你期望的格式,而且需要写的程序通常也比你期望的更加简短。
jq是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上。预编译的二进制文件可以直接在Linux、OS X和windows系统上运行,当然在linux和OS X系统你需要赋与其可执行权限;
在linux系统中也可以直接用yum安装。
1# 安装EPEL源: 2yum install -y epel-release 3 4# 安装完EPEL源后,可以查看下jq包是否存在: 5yum list jq 6 7安装jq: 8yum install -y jq
下载页面:
https://stedolan.github.io/jq/download/
在知道jq命令之前,我在linux系统中极少直接去命令去处理json数据,除非只是简单地从中过滤某个字符串,那就用grep结合正则表达式来解决。所以,掌握了jq命令,则可以让linux命令和shell脚本在处理json数据时变得得心应手。
jq例子
为了便于演示jq的功能,我们在文件json.txt中保存如下内容:
1cat json.txt 2 3[{"name":"站长工具","url":"http://tool.chinaz.com","address":{"city":"厦门","country":"中国"},"arrayBrowser":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]},{"name":"站长之家","url":"http://tool.zzhome.com","address":{"city":"大连","country":"中国"},"arrayBrowser":[{"name":"360","url":"http://www.so.com"},{"name":"bing","url":"http://www.bing.com"}]}] 4 5
为了让你理解文件中的内容,对比jq的效果,在json解析工具中显示为:
"."
最简单的jq程序是表达式".",它不改变输入,但可以将其优美地输出,便于阅读和理解。
1cat json.txt | jq '.' 2 3[ 4 { 5 "name": "站长工具", 6 "url": "http://tool.chinaz.com", 7 "address": { 8 "city": "厦门", 9 "country": "中国" 10 }, 11 "arrayBrowser": [ 12 { 13 "name": "Google", 14 "url": "http://www.google.com" 15 }, 16 { 17 "name": "Baidu", 18 "url": "http://www.baidu.com" 19 } 20 ] 21 }, 22 { 23 "name": "站长之家", 24 "url": "http://tool.zzhome.com", 25 "address": { 26 "city": "大连", 27 "country": "中国" 28 }, 29 "arrayBrowser": [ 30 { 31 "name": "360", 32 "url": "http://www.so.com" 33 }, 34 { 35 "name": "bing", 36 "url": "http://www.bing.com" 37 } 38 ] 39 } 40] 41 42
[index]
输出列表中的第一个元素,可以使用[index]:
1cat json.txt | jq '.[0]' 2 3{ 4 "name": "站长工具", 5 "url": "http://tool.chinaz.com", 6 "address": { 7 "city": "厦门", 8 "country": "中国" 9 }, 10 "arrayBrowser": [ 11 { 12 "name": "Google", 13 "url": "http://www.google.com" 14 }, 15 { 16 "name": "Baidu", 17 "url": "http://www.baidu.com" 18 } 19 ] 20} 21 22
管道线|
jq支持管道线|,它如同linux命令中的管道线——把前面命令的输出当作是后面命令的输入。如下命令把.[0]作为{...}的输入,进而访问嵌套的属性,如.name和.address.city。
观察如下几个命令,通过改变|前后的输入和输出来达到不同的效果:
1cat json.txt | jq '.[0] | {name:.name,city:.address.city}' 2 3{ 4 "name": "站长工具", 5 "city": "厦门" 6} 7 8 9cat json.txt | jq '.[0] | {name:.arrayBrowser[1].name,city:.address.city}' 10 11{ 12 "name": "Baidu", 13 "city": "厦门" 14} 15 16 17cat json.txt | jq ".[] | {name:.arrayBrowser[1].name,city:.address.city}" 18 19{ 20 "name": "Baidu", 21 "city": "厦门" 22} 23{ 24 "name": "bing", 25 "city": "大连" 26} 27
[]
如果希望把jq的输出当作一个数组,可以在前后加上[]:
1cat json.txt | jq "[.[] | {name:.arrayBrowser[1].name,city:.address.city}]" 2 3[ 4 { 5 "name": "Baidu", 6 "city": "厦门" 7 }, 8 { 9 "name": "bing", 10 "city": "大连" 11 } 12] 13 14
自定义key
在{}中,冒号前面的名字是映射的名称,你可以任意修改,如:
1cat json.txt | jq "[.[] | {name_001:.arrayBrowser[1].name,city_002:.address.city}]" 2 3[ 4 { 5 "name_001": "Baidu", 6 "city_002": "厦门" 7 }, 8 { 9 "name_001": "bing", 10 "city_002": "大连" 11 } 12] 13
本文转自 https://blog.csdn.net/whatday/article/details/105781873,如有侵权,请联系删除。
