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[].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/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Makefile的override

今天在编译opengauss extension时遇到一个报错&#xff1a; 简单的理解就是编译时要加 -fPIC&#xff0c;告诉编译器生成Position Independent Code&#xff0c;试过 make CPPFLAGS-fPIC 可以成功编译&#xff0c;不过看到其它的解决方案是在Makefile中加 override CPPFLAG…

代码随想录算法训练营第三十天 | 332.重新安排行程,51. N皇后 ,37. 解数独

这道题是一道欧拉路径/ 欧拉回路的一笔画问题&#xff0c;需要找出开销最小的一笔画方案 这种一笔画的问题&#xff0c;以前学数据结构的时候我们习惯把图放进二维数组中存储&#xff0c;但对于这种无规律的图结构&#xff0c;我们可以使用二维的哈希表来存储&#xff0c;这样…

【4月】CDA Club 第2期数据分析组队打卡学习活动开启!

活动名称 CDA Club 第2期数据分析组队打卡学习活动 活动介绍 本次打卡活动由CDA俱乐部旗下学术部主办。目的是通过数据分析科普内容&#xff0c;为数据分析爱好者提供学习和交流的机会。方便大家利用碎片化时间在线学习&#xff0c;以组队打卡的形式提升学习效果&#xff0c…

水离子雾化壁炉的原理和技术解析

水离子雾化壁炉采用超声波雾化技术将水分子雾化成微细的水离子&#xff0c;然后通过风扇吹出再经过UVC紫外线杀菌产生安全仿真的火焰效果。以下是水离子雾化壁炉的原理和技术解析&#xff1a; 超声波雾化技术&#xff1a; 水离子雾化壁炉利用超声波振动器产生高频振动&#xf…

[Java、Android面试]_13_map、set和list的区别

本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&#xff0c;后续会陆续分享出来&#xff0c;感兴趣的朋友可关注收…

TSN协议原理!看完这一篇就够了(1)——时钟同步IEEE802.1AS-2020

▎前言 在许多应用场景中&#xff0c;一个本地局域网中互联的设备集群需要共享同一个时间&#xff0c;以支持各设备的协同工作。例如&#xff1a;音频设备与视频设备的配合播放&#xff0c;雷达与摄像头的数据融合等&#xff1b;这样一个看似简单的域功能&#xff0c;细化成为…

好书推荐 :《 提问的艺术:让 ChatGPT 给出高质量答案 》

AGI 时代降临&#xff01;还不知如何向 ChatGPT 提问&#xff1f; 恰当的提示至关重要&#xff01;《提问的艺术—让 ChatGPT 给出高质量答案》一书&#xff0c;共 24 章&#xff0c;系统介绍了如何向 ChatGPT 提问以获取优质答案&#xff0c;是 ChatGPT 时代的入门指南&#x…

【 Mysql8.0 忘记登录密码 可以试试 】

** Mysql8.0 忘记登录密码 可以试试 ** 2024-3-21 段子手168 1、首先停止 mysql 服务 &#xff0c;WIN R 打开运行&#xff0c;输入 services.msc 回车打开服务&#xff0c;找到 mysql 服务&#xff0c;停止。 然后 WIN R 打开运行&#xff0c;输入 CMD 打开控制台终端输…

‘npm‘ 不是内部或外部命令,也不是可运行的程序

npm认识三年了&#xff0c;今天才知道这是node.js的命令 也就是说&#xff0c;想要在cmd里面运行 npm 命令&#xff0c;但就的安装node.js 1. node.js安装 没有安装包的先下载安装包&#xff1a;下载 | Node.js 中文网 (nodejs.cn) 下载之后双击打开&#xff0c;一路安装确…

如何为企业策划一场XR虚拟直播?

活动年年办&#xff0c;都是老一套&#xff0c;想玩点新花样&#xff1f; 预算有限&#xff0c;但还是想把活动办的逼格高一点&#xff1f; 想通过活动&#xff0c;让更多的人知道自己企业的品牌&#xff1f; 随着AIGC技术的不断演变&#xff0c;企业活动的形式和内容也在不…

Node.js之沙盒专题

​ Node.js一直是薄弱项&#xff0c;今天特意整理一下&#xff0c;基本上是各个大佬写的大杂烩&#xff0c;仅用于学习记录~~~ 1. child_process 首先介绍一下nodejs中用来执行系统命令的模块child_process。Nodejs通过使用child_process模块来生成多个子进程来处理其他事物…

滤波器自动化测试:用网络分析仪、示波器、功率计测量功率

滤波器的功率是电压与电流的乘积&#xff0c;滤波器的功率可以通过测量电压与电流计算得出。滤波器的功率对滤波器的稳定运行是至关重要的&#xff0c;如果功率过小可能会导致滤波器无法正常工作;功率越大则有可能会造成滤波器的损坏。因此滤波器的功率测量是非常重要的步骤。 …

基于51单片机的客车汽车安全气囊控制器Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/10enj1EYm_0Z8f_19Sz_eCQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52简介&#xff1a; AT89C52是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectronics&#xff09;公…

第一周周考技能

文章目录 1月1. 任意输入一个3位整数&#xff08;100~999&#xff0c;包含100与999&#xff09;&#xff0c;判断输入的整数是否是质数&#xff0c;如果是质数则输出是质数&#xff0c;否则输出不是质数2.“降序数”是指一个自然数的低位数字不大于高位数字的数。例如&#xff…

工单系统大揭秘!选择工单系统需注意的关键因素!

如何选择工单系统&#xff1f;工单系统作为数字化工具&#xff0c;可以帮助企业高效处理工单业务问题&#xff0c;助力企业数字化转型。目前市面上的工单系统可谓是琳琅满目。 本文详细讲解了目前市面上工单系统的主要类型&#xff0c;以及企业该如何选择工单系统~ 一、工单系…

怎样批量在文件名后面加上相同的字符?

怎样批量在文件名后面加上相同的字符&#xff1f;在日常工作中&#xff0c;有时我们需要对大量文件进行批量处理&#xff0c;比如在文件名后面统一添加相同的字符。这项工作可以通过编写简单的脚本或程序来实现&#xff0c;从而提高工作效率。批量在文件名后面加上相同的字符是…

JS-13-高阶函数

一、高阶函数的定义 JavaScript的函数其实都指向某个变量&#xff0c;如&#xff1a; var abs function (x) {// 函数体 }; 既然变量可以指向函数&#xff0c;函数的参数能接收变量&#xff0c;那么一个函数就可以接收另一个函数作为参数&#xff0c;这种函数就称之为高阶函…

CCF-CSP认证考试 202212-2 训练计划 100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202212-2 训练计划 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题背景 西西艾弗岛荒野求生大赛还有 n n n 天开幕&#xff01; 问题描述 为了在大赛中取得…

shell实现查询进程号并批量kill(脚本)

问题或需求描述 在shell中&#xff0c;如果你想通过命令行查询出一系列匹配某个关键词的进程&#xff0c;并使用xargs命令批量结束这些进程&#xff0c;可以按照以下步骤操作&#xff1a; # 查询并提取进程号 pgrep -f "关键词" | xargs kill# 或者&#xff0c;如果…

Qt 用任意直线来分割多边形,返回分割后的多边形

任意直线分割多边形&#xff0c;返回分割后的多边形 效果 使用示例 QPolygonF LineSegmentationPolygon(const QPolygonF& poly, const QLineF& line, SideToRemove sideToRemove)源码 enum class SideToRemove {None,Left,Right};// 直线分割多边形 QPolygonF LineS…