shell编程-jq命令详解

文章目录

  • 前言
  • 一、jq简介
    • 1. 简介
    • 2. 语法
    • 3. 命令选项
  • 二、用于处理json数据
    • 1. 过滤
      • 1.1 标识运算符
      • 1.2 基本过滤
      • 1.3 获取对象属性
      • 1.3 迭代数组元素
      • 1.4 获取数组元素
      • 1.5 使用运算符
    • 2. 类型和值
      • 2.1 数组构造
      • 2.2 对象构造
      • 2.3 递归下降
    • 3. 内置运算符和函数
      • 3.1 算术运算符
      • 3.2 函数
        • 3.2.1 length
        • 3.2.2 keys和keys_unsorted
        • 3.2.3 has(key)
        • 3.2.4 map(f)和map_values(f)
        • 3.2.5 del(path_expression)
        • 3.2.6 getpath(PATHS)
  • 总结


前言

本文介绍了jq工具的基本概念、语法和常用命令选项。jq是一个强大的JSON处理工具,可以帮助我们在命令行中对JSON数据进行过滤、转换和聚合等操作。通过学习本文内容,您将了解如何使用jq来提取和操作JSON数据,以及如何利用内置函数和运算符实现更复杂的处理逻辑。


一、jq简介

1. 简介

jq是一个处理JSON输入的工具,将给定的过滤器应用于其JSON文本输入,并在标准输出上以JSON形式生成过滤器的结果。

2. 语法

jq [options] <jq filter> [file...]jq [options] --args <jq filter> [strings...]jq [options] --jsonargs <jq filter> [JSON_TEXTS...]

3. 命令选项

下面是一些 jq 命令的选项:

  • -c:以紧凑格式而不是漂亮的格式输出;
  • -n:将 null 作为单个输入值使用;
  • -e:基于输出设置退出状态码;
  • -s:将所有输入读取到一个数组中,然后对其应用过滤器;
  • -r:输出原始字符串,而不是 JSON 文本;
  • -R:读取原始字符串,而不是 JSON 文本;
  • -C:对 JSON 进行着色;
  • -M:单色输出(不对 JSON 进行着色);
  • -S:按输出时对象的键对其进行排序;
  • --tab:使用制表符进行缩进;
  • --arg a v:将变量 $a 设置为值 <v>
  • --argjson a v:将变量 $a 设置为 JSON 值 <v>
  • --slurpfile a f:将变量 $a 设置为从 <f> 读取的 JSON 文本数组;
  • --rawfile a f:将变量 $a 设置为由 <f> 的内容组成的字符串;
  • --args:其余参数是字符串参数,而不是文件;
  • --jsonargs:其余参数是 JSON 参数,而不是文件;
  • --:终止参数处理。

命名参数也可以作为 $ARGS.named[] 使用,而位置参数可以作为 $ARGS.positional[] 使用。


二、用于处理json数据

把下面的json数据保存为demo.json文件,将使用demo.json文件为示例进行演示:

{"args": {"foo1": "bar1","foo2": "bar2"},"items": [{"name": "zhangsan","age": "18"},{"name": "lisi","age": "19"},{"name": "wangwu","age": "20"}],"headers": {"x-forwarded-proto": "https","x-forwarded-port": "443","host": "postman-echo.com","x-amzn-trace-id": "Root=1-65faa3d6-3241ccac7e16cccb6ad624df","user-agent": "PostmanRuntime-ApipostRuntime/1.1.0","cache-control": "no-cache","accept": "*/*","accept-encoding": "gzip, deflate, br","cookie": "sails.sid=s:EwVZbX2HjXEMC_pnJ4yiHZ4_z99ZURCH.SNn1CdtJ4ufRX9qvNRioMrrjCQWG+RdFd5aXkV2PrZA","authorization": "Basic cG9zdG1hbjpwb3N0bWFuMTIz"},"url": "https://postman-echo.com/get?foo1=bar1&foo2=bar2"
}

1. 过滤

1.1 标识运算符

标识运算符是一个小数点.,在jq命令中,.是一个特殊字符,表示当前JSON对象的引用。它可以用于访问和处理JSON数据的各个部分。

使用.可以执行以下操作:

  1. 访问对象属性:.property表示获取当前对象中名为"property"的属性值。

  2. 迭代数组元素:.[]表示遍历当前数组,并返回其中每个元素。

  3. 过滤器操作:通过结合.和其他过滤器操作符(如条件、映射、折叠等),可以对JSON数据进行筛选、转换和聚合等复杂处理。例如,.[] | select(.age > 18)会选择年龄大于18岁的所有数组元素。

  4. 调用函数或方法:你还可以使用.来调用内置函数或自定义函数,并将其应用于当前上下文中的值。例如,在一个字符串上应用 .toupper() 函数将字符串转换为大写形式。

1.2 基本过滤

使用jq命令不进行过滤输出数据。

cat demo.json | jq .

如下图所示:

在这里插入图片描述

1.3 获取对象属性

cat demo.json | jq .args

在这里插入图片描述

cat demo.json | jq .args.foo1

在这里插入图片描述

cat demo.json | jq '.url, .args.foo1'

在这里插入图片描述

1.3 迭代数组元素

cat demo.json | jq .items[]

在这里插入图片描述

cat demo.json | jq .items[].namecat demo.json | jq .items[] | jq .namecat demo.json | jq '.items[] | .name'

在这里插入图片描述

cat demo.json | jq .items[].age

在这里插入图片描述

cat demo.json | jq '.items[] | "\(.name):\(.age)"'

在这里插入图片描述

1.4 获取数组元素

cat demo.json | jq .items[0]

在这里插入图片描述

cat demo.json | jq .items[1]

在这里插入图片描述

cat demo.json | jq .items[-1]

在这里插入图片描述

cat demo.json | jq .items[1,2]

在这里插入图片描述

cat demo.json | jq .items[0:3]

在这里插入图片描述

cat demo.json | jq .items[1:3]

在这里插入图片描述

1.5 使用运算符

cat demo.json | jq '(.items[].age + 1) * 2'

在这里插入图片描述

cat demo.json | jq '(.items[1].age + 1) * 2'

在这里插入图片描述

2. 类型和值

jq中支持与JSON相同的数据类型,包括数字、字符串、布尔值、数组和对象(在JSON中称为只有字符串键的哈希表),以及"null"。

布尔值、null、字符串和数字在jq中的写法与JSON相同。就像jq中的其他所有内容一样,这些简单值接受一个输入并产生一个输出。

在jq中,数字内部使用IEEE754双精度近似表示。对于任何涉及数字(无论是字面量还是先前过滤器结果)进行算术运算时,将生成双精度浮点数结果。

然而,在解析字面量时,如果没有对该值应用变换,则会将原始字面量字符串存储起来。如果没有对其进行转换为double操作会导致损失,则此原始形式将保留到输出结果中去。

2.1 数组构造

数组构造:[]
与JSON中一样,用于构造数组,例如 []. 数组的元素可以是任何jq表达式,包括管道。所有表达式产生的结果都会被收集到一个大数组中。

理解","运算符,就能以不同角度看待jq的数组语法:这个表达式并没有使用内置语法来表示逗号分隔的数组,而是将操作符(collect results)应用于表达式 。

示例:

cat demo.json | jq '[.args.foo1, .items[]]'

在这里插入图片描述

cat demo.json | jq '[.items[].age | . + 2]'

在这里插入图片描述

2.2 对象构造

对象构造:{}
与JSON类似,用于构造对象(也称为字典或哈希表)。如果键是"标识符样式"的,则可以省略引号。值可以是任何表达式,该值会应用于 {} 表达式的输入上。

示例:

cat demo.json | jq '{url, foo: .args.foo1}'cat demo.json | jq '{url: .url, foo: .args.foo1}'

在这里插入图片描述

cat demo.json | jq '{url, name: .items[].name}'

在这里插入图片描述

2.3 递归下降

递归下降:…
使用递归下降运算符 …,可以逐级遍历数据结构,并产生每个值。这与零参数内置函数相同。

示例:

cat demo.json | jq '.. | .name?'

在这里插入图片描述

3. 内置运算符和函数

3.1 算术运算符

+ - * / %

示例:

cat demo.json | jq '.items[0].age + 2'cat demo.json | jq '.items[0].age - 2'cat demo.json | jq '.items[0].age * 2'cat demo.json | jq '.items[0].age / 2'cat demo.json | jq '.items[0].age % 5'

在这里插入图片描述

3.2 函数

3.2.1 length

length函数用于获取各种不同类型值的长度。

cat demo.json | jq '. | length'cat demo.json | jq '.items | length'cat demo.json | jq '.items[] | length'

在这里插入图片描述

3.2.2 keys和keys_unsorted

keys 是许多编程语言中的内置函数,用于返回对象或字典的键。当应用于对象时,它会返回一个包含该对象键的数组。这些键按照 Unicode 码点顺序进行“字母顺序”排序。

keys_unsorted 函数与 keys 类似,但是当输入为对象时,并不对其进行排序;相反地,在大致上保持插入顺序作为输出结果的键。

cat demo.json | jq keyscat demo.json | jq keys_unsortedcat demo.json | jq '.items[] | keys_unsorted'

在这里插入图片描述

3.2.3 has(key)

has(key) 是一个内置函数,用于判断输入对象是否具有给定的键(key),或者输入数组是否在给定索引处存在元素。

对于对象来说,调用 has(key) 函数会返回一个布尔值,表示该对象是否包含指定的键。

对于数组来说,在某个特定索引位置上使用该函数可以判断该位置上是否存在元素。它也将返回一个布尔值作为结果。

cat demo.json | jq 'has("items")'cat demo.json | jq 'has("name")'cat demo.json | jq '.items[] | has("name")'

在这里插入图片描述

3.2.4 map(f)和map_values(f)

map(f)map_values(f)是两个函数,用于对输入数组或对象中的每个值应用指定的过滤器(函数)f。它们分别相当于.[] | f.[] |= f

在没有错误发生的情况下,无论何时使用这些函数都会输出一个数组。如果给定一个数组作为输入,则输出也是一个数组;如果给定一个对象作为输入,则输出将是一个具有相同键但值经过处理后的新对象。

echo [18,19,20] | jq 'map(.+1)'echo '{"a": 1, "b": 2, "c": 3}' | jq 'map(.+1)'echo '{"a": 1, "b": 2, "c": 3}' | jq 'map_values(.+1)'

在这里插入图片描述

3.2.5 del(path_expression)

del是一个内置函数,用于从对象中删除一个键及其对应的值。

echo '{"foo": 42, "bar": 9001, "baz": 42}' | jq 'del(.foo)'

在这里插入图片描述

3.2.6 getpath(PATHS)

内置函数输出在.getpath.PATHS中每个路径找到的值。

cat demo.json | jq 'getpath(["args","foo1"],["args","foo2"])'cat demo.json | jq '[getpath(["args","foo1"],["args","foo2"])]'

在这里插入图片描述


总结

通过学习并掌握jq工具,在命令行中高效地处理JSON数据变得轻而易举。无论是从复杂嵌套结构中提取特定字段还是对数组进行筛选与映射操作,都可以借助jq简洁而灵活地完成。通过深入理解本文介绍的标识运算符、数组构造、对象构造以及内置函数等概念,在实际应用场景中能够更加熟练地使用这些功能,并根据需要进一步扩展自己的应用程序或脚本。

希望本教程对您有所帮助!如有任何疑问或问题,请随时在评论区留言。感谢阅读!

参考链接:

  • https://jqlang.github.io/jq/manual/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCL点云处理之最小中值平方(Lmeds法)拟合平面(二百三十四)

PCL点云处理之 最小中值平方法(Lmeds)拟合平面(二百三十四) 一、算法介绍一、拟合原理二、具体实现1.代码2.结果一、算法介绍 (本文提供详细注释,输出拟合平面参数和平面点云) Lmeds(Least Median of Squares)是一种统计学方法,用于拟合数据并减少异常值对拟合结果…

CISP证书如何查询?软考信息安全工程师和CISP哪个好?

在信息安全领域&#xff0c;证书是衡量一个人专业能力和经验的重要标志。 CISP(国家信息安全专业人员认证)和软考信息安全工程师证书都是业内认可度较高的证书。 那么&#xff0c;对于想要提升自己信息安全能力的人来说&#xff0c;究竟应该如何选择呢&#xff1f; 下面将为…

汽车信息安全--密钥管理系统初探(1)

目录 1.为什么需要密钥管理 2.常见密钥种类 3.小结 当真正开始思考如何设计基于HSM的密钥管理系统,才发现基于之前vHSM的套路是相当不完备的。 仅仅是依靠AUTOSAR KeyM和CSM提出的密钥管理要点作为需求,总觉得是无根之水,不够踏实。因此我打算从密钥的实际使用场景、HSM…

基础篇Redis

基础篇Redis 1.Redis简单介绍 Redis是一种键值型的NoSql数据库&#xff0c;这里有两个关键字&#xff1a; 键值型NoSql 其中键值型&#xff0c;是指Redis中存储的数据都是以key.value对的形式存储&#xff0c;而value的形式多种多样&#xff0c;可以是字符串.数值.甚至json…

前端-html-01

1.HTML的标签分类 1.1常用排版标签 标签名语义和功能属性单标签还是双标签h1 ~ h6一级标题~六级标题无双标签p段落无双标签hr分隔线无单标签br换行无单标签pre原格式显示无双标签div无语义&#xff0c;用于页面布局无双标签 1.1.1h标题标签 <!DOCTYPE html> <htm…

【Node.js 常用命令(第一篇)】揭秘Node.js:掌握这些常用命令,让你在开发路上风生水起!

目录 前言 30条常用的Node.js 命令 1. node - 启动 Node.js REPL 或执行脚本 2. npm - Node.js 包管理器 3. npx - 执行 Node 包程序 4. nodemon - 自动重启 Node.js 应用 5. express - 快速搭建 Web 应用框架 6. git - 版本控制系统 7. mocha - 测试框架 8. eslint …

面试算法-104-乘积最大子数组

题目 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续 子数组 &#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。 示例 1: 输入: nums [2,3,-2,4] 输出: 6 解释: 子数…

python ch8 函数

# 如何编写函数&#xff0c;以及如何传递实参&#xff0c;让函数能够访问完成其工作所需 # 的信息&#xff1b;如何使用位置实参和关键字实参&#xff0c;以及如何接受任意数量的实参&#xff1b;显示输出的函数和返 # 回值的函数&#xff1b;如何将函数同列表、字典、if语句…

Android_NDK调试

第一步&#xff1a; 链接log动态库 在Android.mk文件中添加 LOCAL_LDLIBS -llog 注意&#xff1a;一定要在 include $(BUILD_SHARED_LIBRARY) 之上添加&#xff0c;因为当执行到这句话的时候就表示所有的lib动态库已经加载完毕了&#xff0c;所以当你在这句代码之后再添加…

C++ 中常用的 STL

标准模板库 (STL) 是 C 标准库中一个强大的组件&#xff0c;它提供了各种通用数据结构和算法。STL 旨在提高代码的可重用性、效率和可读性。本文将介绍 C 中一些常用的 STL&#xff0c;并提供代码示例。 容器 容器是用于存储和组织数据的对象。STL 中提供了以下几种容器&…

Redis I/O多路复用

I/O多路复用 Redis的I/o多路复用中&#xff0c;将多个连接放到I/O复用程序中&#xff0c;这个复用程序具体是什么&#xff0c;是Redis的主线程吗 在Redis的I/O多路复用机制中&#xff0c;“复用程序”实际上指的是操作系统提供的系统调用接口&#xff0c;如Linux下的epoll、sel…

ZYNQ学习之Ubuntu环境下的Shell与APT下载工具

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Ubuntu Shell操作 简单的说Shell 就是敲命令。国内把 Linux 下通过命令行输入命令叫…

如何本地搭建群晖虚拟机并实现无quickconnect服务环境远程访问

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

蓝桥04数组矩阵

04数组矩阵 顺时针打印二维数组 0所在行列清零 z字形打印二维数组 找出边界为1的最大子方针 返回子数组最大累加和 子矩阵最大累加和 矩阵运算 顺时针打印二维数组 int[][] arr {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20}};int r 0;int c 0;int…

中国象棋C++

题目描述 在中国象棋中正所谓新手玩车&#xff0c;熟手玩炮&#xff0c;老手玩马&#xff0c;由此可见象棋中炮的地位还是比较高的。 给定一个nm的棋盘&#xff0c;全部摆满炮&#xff0c;我们视所有炮都不属于同一阵营&#xff0c;他们之间可以相互攻击但不能不进行攻击直接移…

解密Google Cloud 全新 PaLM2及创新应用

&#x1f4f8;背景 因长期在大模型相关的部门工作&#xff0c;每天接收到很多和AI相关的信息&#xff0c;但小编意识到目前理解到的一些AI知识还有些片面。 恰逢稀土掘金开发者大会有谈到大模型相关的知识&#xff0c;于是借此机会&#xff0c;对大模型相关的一些知识再了解一…

面试问答:什么是索引?它有哪些优缺点?它的适用/不适用场景?哪些情况会造成索引失效?

文章目录 &#x1f412;个人主页&#xff1a;信计2102罗铠威&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;什么是索引&#xff1f;&#xff08;按角度答&#xff01;&#xff1a;作用&#xff0c;存放位置&#xff09;&#x1f415;索引的优缺点&…

递归——N皇后

用递归替代多重循环 什么是N皇后&#xff1a; 在nn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n皇后问题等价于在nn的棋盘上放置n个皇后&#xff0c;任何2个皇后不妨在同一行或同一列或同一…

【SpringCloud】探索Eureka注册中心

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

Protobuf基础使用

Protobuf是什么 在我们日常编写代码的过程中&#xff0c;经常会涉及到网络传输的部分。我们通常会在网络之间传递各种各样的请求&#xff0c;但是在我们日常架构之中&#xff0c;经常会涉及后端服务器之间的通信&#xff0c;通信过程中&#xff0c;可能传递的对象就是一个类。…