shell jq教程

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
相关推荐
小陈phd1 分钟前
Vscode LinuxC++环境配置
linux·c++·vscode
运维&陈同学4 分钟前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
是阿建吖!5 分钟前
【Linux】进程状态
linux·运维
hzyyyyyyyu19 分钟前
内网安全隧道搭建-ngrok-frp-nps-sapp
服务器·网络·安全
明明跟你说过34 分钟前
Linux中的【tcpdump】:深入介绍与实战使用
linux·运维·测试工具·tcpdump
Komorebi.py2 小时前
【Linux】-学习笔记05
linux·笔记·学习
Mr_Xuhhh2 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
中云DDoS CC防护蔡蔡3 小时前
微信小程序被攻击怎么选择高防产品
服务器·网络安全·微信小程序·小程序·ddos
HPC_fac130520678164 小时前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力