1. jq 简介
jq 是一款命令行下处理JSON数据的工具。其可以接受标准输入,命令管道或者文件中的JSON数据,经过一系列的过滤器(filters)和表达式的转后形成我们需要的数据结构并将结果输出到标准输出中。jq的这种特性使我们可以很容易地在Shell脚本中调用它。
常用选项
-c 紧凑输出json数据
-e 根据输出结果设置命令退出状态码
-s 读取所有输入到一个数组
-r 输出原始字符串,而不是一个JSON格式
-C 高亮显示
-M 单色显示
-S 排序对象
--tab 使用tab缩进
2. 常用基础命令
2.1. 对整个输入进行输出
语法:jq '.' : 符号,单独的一个'.'符号用来表示对作为表达式输入的整个 JSON 对象的引用。
]# echo '{"name": "tom"}'|jq '.'
{
"name": "tom"
}
]# jq '.' test.json #这种方式可以
2.2. 输出某个字段或者某个索引的值
语法:jq '.<key>' ,这里key是字段名称
]# echo '{"name": "tom"}'|jq '.name'
"tom"
#当引用一个不存在的key时,会在原先的key后面加上此key
]# echo '{"name": "tom"}'|jq '.age=10' -c
{"name":"tom","age":10}
2.3. 数组操作
索引也可以是负数,表示从后边倒着数,从-1开始数,负数索引不能出现0及整数
jq '.[]': 取全部数组
]# echo '[{"msg":{"name": "tom"}}, {"msg": {"name": "jack"}}]'|jq '.[]' -c
{"msg":{"name":"tom"}}
{"msg":{"name":"jack"}}
------------------------------------------------------------------------------------------
jq '.[index]': 取数组中的第几个元素
]# echo '[{"msg":{"name": "tom"}}, {"msg": {"name": "jack"}}]'|jq '.[0]' -c
{"msg":{"name":"tom"}}
]# echo '[{"msg":{"name": "tom"}}, {"msg": {"name": "jack"}}]'|jq '.[-2]' -c
{"msg":{"name":"tom"}}
--------------------------------------------------------------------------------------------
jq '.[index1:index2]': 取数组中index1到index2的元素(不包括index2)
]# echo '[{"msg":{"name": "tom"}}, {"msg": {"name": "jack"}}]'|jq '.[0:2]' -c
[{"msg":{"name":"tom"}},{"msg":{"name":"jack"}}]
]# echo '[{"msg":{"name": "tom"}}, {"msg": {"name": "jack"}}]'|jq '.[-2:-1]' -c
[{"msg":{"name":"tom"}}]
---------------------------------------------------------------------------------------
jq '.[index1:]': 取数组中index1到最后
]# echo '[{"msg":{"name": "tom"}}, {"msg": {"name": "jack"}}]'|jq '.[0:]' -c
[{"msg":{"name":"tom"}},{"msg":{"name":"jack"}}]
[root@docker01 ~]# echo '[{"msg":{"name": "tom"}}, {"msg": {"name": "jack"}}]'|jq '.[-2:]' -c
[{"msg":{"name":"tom"}},{"msg":{"name":"jack"}}]
2.4. 字典取值
]# echo '{"msg":{"name":"tom"}}'|jq '.msg.name'
"tom"
[root@docker01 ~]# echo '{"msg":{"name":"tom"}}'|jq '.msg["name"]'
"tom"
2.5. 循环输出所有的值,如数组嵌套
语法:jq '.[]'
]# echo '[{"msg":{"name": "tom"}}, {"msg": {"name": "jack"}}]'|jq '.[]' -c
{"msg":{"name":"tom"}}
{"msg":{"name":"jack"}}
2.6. 输出多个索引的值,可以用逗号分割
语法: jq '.key1,.key2'
]# echo '[{"msg":{"name": "tom"}}, {"msg": {"name": "jack"}}]'|jq '.[0].msg.name,.[1].msg.name' -c
"tom"
"jack"
2.7. 用管道符号|可以对其进行再次处理
语法:jq '命令|命令'
]# echo '{"msg":{"name":"tom","age":10}}'|jq '.msg.name,.msg.age'
"tom"
10
#.msg|.name,.age 的意思是,.msg.name,.msg.age
]# echo '{"msg":{"name":"tom","age":10}}'|jq '.msg|.name,.age'
"tom"
10
2.8. 括号的作用
]# echo '{"msg":{"name":"tom","age":10}}'|jq '.msg.age+2*5'
20
]# echo '{"msg":{"name":"tom","age":10}}'|jq '(.msg.age+2)*5'
60
2.9. length求长度
计算数组,字符串的长度
语法:jq '|length'
-------------------------------------------------------------------------------------
#计算数组长度
]# echo '{"msg":[{"name":"tom"},{"name":"jack"}]}'|jq '.msg'
[
{
"name": "tom"
},
{
"name": "jack"
}
]
]# echo '{"msg":[{"name":"tom"},{"name":"jack"}]}'|jq '.msg|length'
2
-------------------------------------------------------------------------------------
#计算字符的长度
]# echo '{"msg":[{"name":"tom"},{"name":"jack"}]}'|jq '.msg[].name'
"tom"
"jack"
]# echo '{"msg":[{"name":"tom"},{"name":"jack"}]}'|jq '.msg[].name|length'
3
4
2.10. 输出所有的keys
语法: jq 'keys'
]# echo '{"name": "tom","age":10}'|jq 'keys' -c
["age","name"]
2.11. 判断存不存在某个键
语法: jq 'has("key")' 可以多个key一起判断 jq 'has("key1","key2")'
]# echo '{"name": "tom","age":10}'|jq 'has("name","age")'
true
true
2.12. 向josn输入中追加数据
-----------------------------------------------------------------------------
#管道输入追加数据
echo '{"msg":[{"name":"tom"},{"name":"jack"}]}'|jq '.msg[2]={"name":"jerry"}' -c
{"msg":[{"name":"tom"},{"name":"jack"},{"name":"jerry"}]}
-----------------------------------------------------------------------------
#json文件追加数据
]# cat test.json
[{"msg":{"name": "tom"}},{"msg": [{"book": 16}]}]
]# cat test.json|jq '.[2]={"msg":{"age":10}}' -c
[{"msg":{"name":"tom"}},{"msg":[{"book":16}]},{"msg":{"age":10}}]
[root@docker01 ~]# cat test.json|jq '.[2]={"msg":{"age":10}}' -c > test-tmp.json && mv -f test-tmp.json test.json
[root@docker01 ~]# cat test.json
[{"msg":{"name":"tom"}},{"msg":[{"book":16}]},{"msg":{"age":10}}]
2.13. 内置运算(+,-,*,/,%, +=,-=,*=,/=,%=)
----------------------------------------------------------------------------------------------------------------
#当取出的元素是字符串时,算数符中只有+,+=,*,*=,/(用指定的字符分割字符串,形成数组),/=能用
]# echo '{"name":"*"}'|jq '.name+"a"' -c
"*a"
]# echo '{"name":"*"}'|jq '.name+="a"' -c
{"name":"*a"}
]# echo '{"name":"*"}'|jq '.name*3' -c
"***"
]# echo '{"name":"*"}'|jq '.name*=3' -c
{"name":"***"}
]# echo '{"name": "1212345"}'|jq '.name/"1"' -c
["","2","2345"]
[root@docker01 ~]# echo '{"name": "1212345"}'|jq '.name/"2"' -c
["1","1","345"]
]# echo '{"name": "1212345"}'|jq '.name/="2"' -c
{"name":["1","1","345"]}
----------------------------------------------------------------------------------------------------------------
#当取出的元素是数字时,(+,-,*,/,%, +=,-=,*=,/=,%=)都可以用
]# echo '{"number":2}'|jq '.number+3' -c
5
]# echo '{"number":2}'|jq '.number+=3' -c
{"number":5}
]# echo '{"number":2}'|jq '.number*3' -c
6
]# echo '{"number":2}'|jq '.number*=3' -c
{"number":6}
]# echo '{"number":2}'|jq '.number/3' -c
0.6666666666666666
]# echo '{"number":2}'|jq '.number/=3' -c
{"number":0.6666666666666666}
]# echo '{"number":2}'|jq '.number%3' -c
2
]# echo '{"number":2}'|jq '.number%=3' -c
{"number":2}
]# echo '{"number":2}'|jq '.number+2-4*4/4%2' -c
4
]# echo '{"number":2}'|jq '.number+=2-4*4/4%2' -c
{"number":4}
-----------------------------------------------------------------------------------------------------------------
#直接进行数据运算
]# echo 2|jq '.+2'
4
]# echo 2|jq '.-2'
0
]# echo 2|jq '.*2'
4
]# echo 2|jq './2'
1
]# echo 2|jq '.%2'
0
]# echo 3.1|jq '.+2-2*2/2%2'
5.1
]# echo 3.1|jq '(.+2-2)*2/2%2'
1