jq
文章目录
介绍
一个灵活的轻量级命令行JSON处理器。
功能
- 处理JSON输入,可以将给定的过滤器应用与JSON文本输入并在标准输出上将过滤器的结果生成为JSON
安装
|
|
语法
|
|
选项
|
|
练习
以漂亮格式输出
|
|
-
echo '{"foo": {"bar": {"baz": 123}}}'
首先使用
echo
输出一段 JOSN 格式的字符串 -
| jq '.'
使用管道符
|
将echo
的输出结果传到给jq
处理器。jq
是一个强大的命令行 JSON 处理起,'.'
是一个简单的 jq 表达式,表示原样格式化输出接收的JSON数据。
获取键的值
|
|
-
jq ".foo"
获取JSON字符串中key是 “foo” 的值。
-
jq '.foo.bar'
获取JSON字符串中key是 “bar” 的值。
-
jq '.foo.bar.baz'
获取JSON字符串中key是 “baz” 的值。
数组运算
|
|
-
jq '.[1]'
输出JSON数组的下标为1的元素。
计算值的长度
|
|
-
| jq '.[] | length'
其中
'.[]'
表示遍历数组中的每个元素;length
表示返回每个元素的长度;[{"name": "JSON", "good": true}, {"name": "XML", "good": false}]
这一JSON数组包含了两个对象,分别是name
和good
,由于每个对象都有两个属性,所以输出为2(每个对象的属性数量)[[1,2], "string", {"a":2}, null]
这一JSON包含四个元素,同样'.[]'
是遍历数组中的每个元素,对于每个元素调用length
,故第一个元素[1,2]
的长度是 2,"string"
的长度是6(字符串中有6个字符),{"a":2}
的长度是1(对象中有1个属性),null
的长度是 0(null 没有长度){"foo": {"bar": {"baz": 123}}}
只有一个对象故长度是 1
获取数组的键
|
|
构造一个数组/对象
|
|
使用多个过滤器
|
|
通过管道将一个过滤器的输出当做下一个过滤器的输入
|
|
条件判断
|
|
-
'map(select(. >= 2))'
这是 jq 的一个表达式;
map(...)
会对数组中的每个元素应用给定的表达式,并返回一个新的数组 -
select(. >= 2)
这是一个过滤条件,只选择哪些大于或等于 2 的元素
|
|
综合练习
config.json 配置文件内容如下:
|
|
jq处理如下:
|
|
输出
-
jq -c 'to_entries[]' ${CONFIG_FILE}
jq -c
表示以紧凑格式(即不换行)输出数据。比如:1 2
# cat config.json | jq -c '.' {"centos7_x64":{"enable":false,"count":5,"ports":["13306:3306","18080:18080"],"volumes":["~/workspace:/root/workspace"]},"centos7_altarch":{"enable":true,"count":5,"ports":{"chaos-1":["10000:10000","18080:18080"],"chaos-2":["10001:10000","18081:18080"]},"volumes":{"chaos-1":["~/workspace:/root/workspace"],"chaos-2":["~/workspace:/root/workspace"]}}}
to_entries
是 jq 中一个内置函数,用于将JSON对象转换为一个键值对数组。即它将对象的每个键值对转化为一个包含key和value的对象,形成一个数组。好处就是可以使便利对象的每个属性变得更加简单。比如:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# echo '{"name": "John", "age": 30, "is_student": false}' | jq 'to_entries' [ { "key": "name", "value": "John" }, { "key": "age", "value": 30 }, { "key": "is_student", "value": false } ]
看下查询的结果示例:
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 28 29 30 31 32 33 34 35 36 37 38 39 40
# jq -c 'to_entries[]' config.json | jq '.' { "key": "centos7_x64", "value": { "enable": false, "count": 5, "ports": [ "13306:3306", "18080:18080" ], "volumes": [ "~/workspace:/root/workspace" ] } } { "key": "centos7_altarch", "value": { "enable": true, "count": 5, "ports": { "chaos-1": [ "10000:10000", "18080:18080" ], "chaos-2": [ "10001:10000", "18081:18080" ] }, "volumes": { "chaos-1": [ "~/workspace:/root/workspace" ], "chaos-2": [ "~/workspace:/root/workspace" ] } } }
-
| while read -r entry; do
通过管道将 jq 的输出传递到 while 循环中,一次读取一个键值对,存储在 entry 变量中。
-
key=$(echo "${entry}" | jq -r '.key')
使用 jq -r 从 entry 中提取 key 值,-r 表示以原始格式输出,不加引号。
-
value=$(echo "${entry}" | jq -r '.value')
从 entry 中提取 value 值。
-
enable=$(echo "${value}" | jq -r '.enable')
从 value 中提取 enable 字段,判断该功能是否启用。