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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

【Shiro】Shiro 的学习教程(三)之 SpringBoot 集成 Shiro

目录 1、环境准备2、引入 Shiro3、实现认证、退出3.1、使用死数据实现3.2、引入数据库,添加注册功能后端代码前端代码 3.3、MD5、Salt 的认证流程 4.、实现授权4.1、基于角色授权4.2、基于资源授权 5、引入缓存5.1、EhCache 实现缓存5.2、集成 Redis 实现 Shiro 缓存 1、环境准备 新建一个 SpringBoot 工程,引入依赖:

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

PHP APC缓存函数使用教程

APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”。它为我们提供了缓存和优化PHP的中间代码的框架。 APC的缓存分两部分:系统缓存和用户数据缓存。(Linux APC扩展安装) 系统缓存 它是指APC把PHP文件源码的编译结果缓存起来,然后在每次调用时先对比时间标记。如果未过期,则使用缓存的中间代码运行。默认缓存 3600s(一小时)。但是这样仍会浪费大量C

Qt多语种开发教程

Qt作为跨平台的开发工具,早已应用到各行各业的软件开发中。 今天讲讲,Qt开发的正序怎么做多语言开发。就是说,你设置中文,就中文显示;设置英语就英文显示,设置繁体就繁体显示,设置发育就显示法语等。 开发环境(其实多语种这块根环境没太大关系):win10,Qt.5.12.10 一.先用QtCreator创建一个简单的桌面程序 1.工程就随便命名“LanguageTest”,其他默认。 2.在设计师