shell jq教程

2024-06-22 16:36
文章标签 教程 shell jq

本文主要是介绍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

这篇关于shell jq教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084823

相关文章

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言