shell编程-jq命令详解

news2024/11/14 19:23:21

文章目录

  • 前言
  • 一、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[].name

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

cat 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 keys

cat demo.json | jq keys_unsorted

cat 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.coloradmin.cn/o/1536562.html

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

相关文章

外包干了20天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入杭州某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了2年的功能测试…

20240316-2-协同过滤(collaborative filtering)

协同过滤(collaborative filtering) 直观解释 协同过滤是推荐算法中最常用的算法之一&#xff0c;它根据user与item的交互&#xff0c;发现item之间的相关性&#xff0c;或者发现user之间的相关性&#xff0c;进行推荐。比如你有位朋友看电影的爱好跟你类似&#xff0c;然后最…

PublicCMS 后台模块 站点执行脚本RCE漏洞

PublicCMS是采用2023年主流技术开发的开源JAVACMS系统。由天津黑核科技有限公司开发&#xff0c;架构科学&#xff0c;轻松支撑上千万数据、千万PV&#xff1b;支持可视化编辑&#xff0c;多维扩展&#xff0c;全文搜索&#xff0c;全站静态化&#xff0c;SSI&#xff0c;动态页…

基于Spring Boot的拍卖管理系统设计与实现

摘 要 随着社会的发展&#xff0c;系统的管理形势越来越严峻。越来越多的用户利用互联网获得信息&#xff0c;但各种信息鱼龙混杂&#xff0c;信息真假难以辨别。为了方便用户更好的获得信息&#xff0c;因此&#xff0c;设计一种安全高效的拍卖管理系统极为重要。 为设计一个…

【Linux】Linux工具学习之gcc/g++

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 接上文&#xff0c;我们已经学习了 Linux 中的编辑器 vim 的相关使用方法&#xff0c;现在…

就业班 第二阶段 2401--3.19 day2 DDL DML DQL 多表查询

在mysql库里的语句 \G 竖着排列 ; \g 横着排列 数据库用户组成 双单引号单都行 -- sql的注释 创建mysql用户&#xff1a;&#xff08;兼容5.7 8.0 &#xff09; create user root% identified by Qwer123..; grant all on *.* to root%; flush privileges; mysql 5.7 grant …

使用easyYapi生成文档

easyYapi生成文档 背景1.安装配置1.1 介绍1.2 安装1.3 配置1.3.1 Export Postman1.3.2 Export Yapi1.3.3 Export Markdown1.3.4 Export Api1.3.6 常见问题补充 2. java注释规范2.1 接口注释规范2.2 出入参注释规范 3. 特定化支持3.1 必填校验3.2 忽略导出3.3 返回不一致3.4 设置…

【单调队列】第十四届蓝桥杯省赛C++ C组 Java C组/研究生组 Python A组《子矩阵》(C++)

【题目描述】 给定一个 nm &#xff08;n 行 m 列&#xff09;的矩阵。 设一个矩阵的价值为其所有数中的最大值和最小值的乘积。 求给定矩阵的所有大小为 ab &#xff08;a 行 b 列&#xff09;的子矩阵的价值的和。 答案可能很大&#xff0c;你只需要输出答案对 998244353…

羽毛球移动步法训练

文章目录 简介训练量01 小颠步02 左右并步03 交叉步04 前后并步05 高抬腿06 高抬腿转髋07 左右移动跳08 并步跳09 前后小密步10 弓箭步跳11 开合跳参考文献 简介 本文参考&#xff1a;陈金羽毛球移动专项步法训练&#xff08;BV1cS4y1V7xA&#xff09;和颜叨叨的移动专项步法跟…

数据表练习

思维导图 面试题答问1、IO多路复用的引入目的和原理 目的&#xff1a;在有操作系统时&#xff0c;可以用多线程和进程完成任务并发执行&#xff0c;没有操作系统的情况下可以使用IO多路复用技术来进行任务并发。 原理&#xff1a;将多个阻塞任务的文件描述符统一放到一个检查容…

Qt 容器类控件

Group Box 使用 QGroupBox 实现一个带有标题的分组框可以把其他的控件放到里面作为一组&#xff0c;这样看起来能更好看一点. 核心属性 属性说明title分组框的标题alignment分组框内部内容的对齐方式flat是否是 “扁平” 模式checkable是否可选择. 设为 true&#xff0c;则在…

Golang基础知识(笔记迁移)

golang 变量作用域 局部作用域&#xff1a;代码块、函数内的全局作用域&#xff1a;顶层作用域&#xff0c;代码块外的就是全局&#xff0c;如果变量名大写&#xff0c;则改变量整个程序都可以使用。 类型断言 golang的类型断言在变量后加上.(type)&#xff0c;如果类型断言…

【Android】系统启动流程分析 —— init 进程启动过程

本文基于 Android 14.0.0_r2 的系统启动流程分析。 一、概述 init 进程属于一个守护进程&#xff0c;准确的说&#xff0c;它是 Linux 系统中用户控制的第一个进程&#xff0c;它的进程号为 1&#xff0c;它的生命周期贯穿整个 Linux 内核运行的始终。Android 中所有其它的进程…

python5:基于多进程的并发编程、基于协程的并发编程的学习笔记

进程 为什么要使用多进程&#xff1f;——GIL的存在&#xff0c;多线程实际不是并发执行 将任务分为两类&#xff1a;IO密集型&#xff08;多线程&#xff09;CPU密集型&#xff08;多进程&#xff09; 多进程的基本用法 concurrent.futures.process.ProcessPoolExecutor#进…

移除和替换任何内容:AI 驱动的图像修复工具 | 开源日报 No.204

Sanster/IOPaint Stars: 15.1k License: Apache-2.0 IOPaint 是一款由 SOTA AI 模型驱动的图像修复工具。 该项目解决了从图片中移除任何不需要的对象、瑕疵或人物&#xff0c;以及擦除和替换图片上任何内容&#xff08;由稳定扩散技术支持&#xff09;的问题。 完全免费且开…

ETH Denver 2024 精彩回顾|波卡,远不止一个区块链

ETH Denver 2024 于 2 月 23 日至 3 月 3 日在美国丹佛举行&#xff0c;该活动由 SporkDAO 主办&#xff08;SporkDAO 是一个来自美国科罗拉多州的 Web3 公益开发者组织&#xff0c;其前身或者说起源就是 ETHDenver&#xff0c;后随着组织发展逐渐转变为 DAO 开展了研究、投资等…

YOLO-v8-seg实例分割使用

最近需要实例分割完成一些任务&#xff0c;一直用的SAM(segment anything&#xff09;速度慢&#xff0c;找一个轻量分割模型。 1. YOLO-v8-seg使用 git clone https://github.com/ultralytics/ultralytics.git cd ultralytics vim run.py from ultralytics import YOLO# L…

JS加密解密之字符编码知识

在前端开发中&#xff0c;字符编码是一个至关重要的概念&#xff0c;特别是在数据传输、加密和解密等方面。JavaScript作为一种常用的脚本语言&#xff0c;在处理字符编码时也有其独特之处。本文将详细介绍JavaScript中的字符编码知识&#xff0c;包括字符编码的分类和相关案例…

【C++】1600. 请假时间计算

问题&#xff1a;1600. 请假时间计算 类型&#xff1a;基本运算、整数运算 题目描述&#xff1a; 假设小明的妈妈向公司请了 n 天的假&#xff0c;那么请问小明的妈妈总共请了多少小时的假&#xff0c;多少分钟的假&#xff1f;&#xff08;提示&#xff1a; 1 天有 24 小时&…

2_27. 移除元素

2_27. 移除元素 难度: 简单 提示: 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变…