Linux jq 命令讲解与实战操作(json字符串解析工具)

文章目录

    • 一、概述
    • 二、jq 命令安装
    • 三、jq 命令语法与示例详解
      • 1)基本用法
      • 2)常用选项
      • 3)查询和过滤
        • 1、选择字段
        • 2、过滤
        • 3、遍历数组
        • 4、组合操作
      • 4)修改和创建
        • 1、修改字段值:
        • 2、创建新字段:
        • 3、组合操作:
        • 4、条件修改
      • 5)运算符
        • 1、数值运算
        • 2、比较运算:
        • 3、逻辑运算:
        • 4、条件运算:
      • 6)变量和条件
        • 1、使用变量:
        • 2、条件语句:
        • 3、条件判断和变量组合:
        • 4、使用条件操作修改数据:
      • 7)函数
        • 1、length 函数:
        • 2、map 函数:
        • 3、keys 和 values 函数:
        • 4、to_entries 函数:
        • 5、自定义函数:

一、概述

jq 是一个强大的命令行工具,用于处理 JSON 格式的数据。它可以帮助你查询、过滤、修改和处理 JSON 数据,使得在命令行环境下处理 JSON 变得非常方便。

在这里插入图片描述
GitHub 地址:https://github.com/stedolan/jq
jq 官方网站: https://stedolan.github.io/jq/

二、jq 命令安装

yum install epel-release
yum install -y jq

三、jq 命令语法与示例详解

jq 命令有很多参数和选项,可以帮助你处理和转换 JSON 数据。以下是一些常用的 jq 命令参数和选项:

1)基本用法

jq [options] [filter] [file]
  • options: 可选参数,用于指定 jq 的选项。
  • filter: 必需参数,用于指定 JSON 数据的查询和转换操作。
  • file: 可选参数,要处理的 JSON 数据文件。

2)常用选项

  • -r: 输出原始格式,而不是 JSON 编码。
  • -c: 输出时将结果按行分隔。
  • -s: 将输入视为多个 JSON 对象,用于处理多个 JSON 对象的数组。

3)查询和过滤

  • .: 表示当前对象,用于访问字段或属性。
  • .fieldName: 选择指定字段的值。
  • []: 用于遍历数组元素。
  • select(condition): 根据条件选择元素。
  • map(transform): 对数组中的每个元素应用转换操作。

当使用 jq 进行查询和过滤 JSON 数据时,你可以根据需要执行各种操作。以下是一些常见的查询和过滤示例,假设我们有以下 JSON 数据:

[
  {
    "name": "Alice",
    "age": 25,
    "city": "New York"
  },
  {
    "name": "Bob",
    "age": 30,
    "city": "Los Angeles"
  },
  {
    "name": "Charlie",
    "age": 22,
    "city": "Chicago"
  }
]

1、选择字段

查询并选择所有人的姓名:

cat data.json | jq '.[].name'

输出:

"Alice"
"Bob"
"Charlie"

2、过滤

选择年龄大于 25 岁的人的姓名和城市:

cat data.json | jq '.[] | select(.age > 25) | .name, .city'

输出:

"Bob"
"Los Angeles"

3、遍历数组

遍历并输出所有人的年龄:

cat data.json | jq '.[] | .age'

输出:

25
30
22

4、组合操作

选择年龄在 25 到 30 岁之间的人的姓名和城市,并按照姓名排序:

cat data.json | jq '.[] | select(.age >= 25 and .age <= 30) | .name, .city' | sort
"Alice"
"New York"
"Bob"
"Los Angeles"

这些只是一些基本的查询和过滤示例。jq 支持更多的操作和功能,你可以根据需要进行组合和定制。请根据你的数据和需求来调整和扩展这些示例。

4)修改和创建

  • .fieldName = value: 修改字段的值。
  • del(.fieldName): 删除指定字段。
  • .newField = value: 创建新的字段。

使用 jq 进行 JSON 数据的修改和创建可以帮助你更新数据或添加新的字段。以下是一些示例,假设我们有以下 JSON 数据:

{
  "name": "Alice",
  "age": 25,
  "city": "New York"
}

1、修改字段值:

修改年龄字段的值为 26:

cat data.json | jq '.age = 26'

输出:

{
  "name": "Alice",
  "age": 26,
  "city": "New York"
}

2、创建新字段:

添加一个新的字段 country 并设置其值为 “USA”:

cat data.json | jq '.country = "USA"'

输出:

{
  "name": "Alice",
  "age": 25,
  "city": "New York",
  "country": "USA"
}

3、组合操作:

修改年龄字段的值为 26,并添加一个新的字段 country:

cat data.json | jq '.age = 26 | .country = "USA"'

输出:

{
  "name": "Alice",
  "age": 26,
  "city": "New York",
  "country": "USA"
}

4、条件修改

如果年龄小于 30,则将城市修改为 “Chicago”:

cat data.json | jq 'if .age < 30 then .city = "Chicago" else . end'

输出(由于年龄小于 30,城市被修改):

{
  "name": "Alice",
  "age": 25,
  "city": "Chicago"
}

这些示例演示了如何使用 jq 修改和创建 JSON 数据。你可以根据需要进行组合和调整,以实现你的需求。记住,jq 提供了强大的功能,可以进行更复杂的操作,可以根据文档和教程进一步学习。

5)运算符

  • +, -, *, /: 数值运算。
  • ==, !=, <, >, <=, >=: 比较运算。
  • and, or, not: 逻辑运算。

jq 支持多种运算符,用于在 JSON 数据中执行数值运算、比较和逻辑操作。以下是一些常见的 jq 运算符示例,假设我们有以下 JSON 数据:

{
  "a": 10,
  "b": 5,
  "c": 15
}

1、数值运算

进行加法、减法、乘法和除法运算:

cat data.json | jq '.a + .b'
cat data.json | jq '.a - .b'
cat data.json | jq '.a * .b'
cat data.json | jq '.a / .b'

输出:

15
5
50
2

2、比较运算:

比较字段值,返回布尔结果:

cat data.json | jq '.a > .b'
cat data.json | jq '.a >= .c'
cat data.json | jq '.b < .c'

输出:

true
false
true

3、逻辑运算:

执行逻辑 AND、OR 和 NOT 操作:

cat data.json | jq '.a > 5 and .b < 10'
cat data.json | jq '.a > 15 or .b > 10'
cat data.json | jq 'not (.c > 20)'

输出:

true
true
false

4、条件运算:

使用 if 和 then 进行条件运算:

cat data.json | jq 'if .a > 10 then "Greater" else "Less or equal" end'

输出:

"Less or equal"

这些示例展示了 jq 中的一些常见运算符的用法。你可以根据需要进行更复杂的运算和组合操作,以实现你的需求。在处理 JSON 数据时,jq 提供了广泛的功能来执行各种操作。

6)变量和条件

  • as $variable: 将结果保存到变量中。
  • if condition then ... else ... end: 条件语句。

jq 中,你可以使用变量和条件语句来处理和转换 JSON 数据。以下是一些示例,说明如何在 jq 中使用变量和条件语句,假设我们有以下 JSON 数据:

{
  "name": "Alice",
  "age": 25,
  "city": "New York"
}

1、使用变量:

将字段值存储到变量中,并在输出中使用变量:

cat data.json | jq '.age as $age | "Name: \(.name), Age: \($age)"'

输出:

"Name: Alice, Age: 25"

2、条件语句:

使用 if 和 then 进行条件判断:

cat data.json | jq 'if .age > 18 then "Adult" else "Minor" end'

输出:

"Adult"

3、条件判断和变量组合:

结合条件语句和变量,根据年龄输出不同的消息:

cat data.json | jq 'if .age > 18 then "Name: \(.name), Status: Adult" else "Name: \(.name), Status: Minor" end'

输出:

"Name: Alice, Status: Adult"

4、使用条件操作修改数据:

根据年龄字段的值,如果大于 30 则修改城市字段:

cat data.json | jq 'if .age > 30 then .city = "Chicago" else . end'

输出(由于年龄不大于 30,所以城市字段不变):

{
  "name": "Alice",
  "age": 25,
  "city": "New York"
}

这些示例演示了如何在 jq 中使用变量和条件语句来处理 JSON 数据。你可以根据需要进行组合和定制,以满足你的需求。jq 提供了强大的功能来处理和转换 JSON 数据,可以根据文档和教程进一步学习。

7)函数

jq 支持一些内置函数,如 length, keys, values, tostring 等,用于操作和处理 JSON 数据。

jq 中,你可以使用内置的函数来处理和转换 JSON 数据。以下是一些常见的 jq 函数示例,假设我们有以下 JSON 数据:

{
  "name": "Alice",
  "age": 25,
  "city": "New York",
  "scores": [85, 90, 78, 95]
}

1、length 函数:

获取数组的长度:

cat data.json | jq '.scores | length'

输出:

4

2、map 函数:

对数组中的每个元素应用转换操作:

cat data.json | jq '.scores | map(. * 2)'

输出:

[170,180,156,190]

3、keys 和 values 函数:

获取对象的键和值:

cat data.json | jq '. | keys'
cat data.json | jq '. | values'

输出:

["name","age","city","scores"]
["Alice",25,"New York",[85,90,78,95]]

4、to_entries 函数:

将对象转换为键值对数组:

cat data.json | jq '. | to_entries'

输出:

[
  {"key":"name","value":"Alice"},
  {"key":"age","value":25},
  {"key":"city","value":"New York"},
  {"key":"scores","value":[85,90,78,95]}
]

5、自定义函数:

使用自定义函数进行操作:

cat data.json | jq 'def average: reduce .[] as $item (0; . + $item) / length; .scores | average'

输出:

87

这些是一些常见的 jq 命令参数和选项,可以帮助你进行 JSON 数据的查询、过滤、修改和转换。你可以通过查阅 jq 的官方文档和教程,深入学习和掌握更多功能和用法。


Linux jq 命令讲解与实战操作演示就到这里了,有任何疑问请关注我公众号:大数据与云原生技术分享,进行技术交流,如本篇文章对您有所帮助,麻烦帮忙一键三连(点赞、转发、收藏)~

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

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

相关文章

C#,OpenCV开发指南(01)

C#&#xff0c;OpenCV开发指南&#xff08;01&#xff09; 一、OpenCV的安装1、需要安装两个拓展包&#xff1a;OpenCvSharp4和OpenCvSharp4.runtime.win 二、C#使用OpenCV的一些代码1、需要加头文件2、读取图片3、在图片上画矩形框4、 在图片上画直线 一、OpenCV的安装 1、需…

【FIFO IP系列】FIFO IP参数配置与使用示例

Vivado IP核提供了强大的FIFO生成器&#xff0c;可以通过图形化配置快速生成FIFO IP核。 本文将详细介绍如何在Vivado中配置一个FIFO IP核,以及如何调用这个FIFO IP核。 一、FIFO IP核的配置 1、新建FIFO IP 在Vivado的IP Catalog中找到FIFO Generator IP核&#xff0c;双击…

Node.js |(一)Node.js简介及计算机基础 | 尚硅谷2023版Node.js零基础视频教程

学习视频&#xff1a;尚硅谷2023版Node.js零基础视频教程&#xff0c;nodejs新手到高手 文章目录 &#x1f4da;关于Node.js&#x1f407;为什么要学Node.js&#x1f407;Node.js是什么&#x1f407;Node.js的作用&#x1f407;Node.js下载安装&#x1f407;命令行工具&#x1…

项目优化后续 ,手撸一个精简版VUE项目框架!

之前说过项目之前用的vben框架&#xff0c;在优化完性能后打包效果由原来的纯代码96M变成了56M&#xff0c;后续来啦&#xff0c;通过更换框架&#xff0c;代码压缩到了36M撒花~ 现在就来详细说说是怎么手撸一个框架的&#xff01; 方案&#xff1a; 搭建一套 vite vue3 a…

流量卡线上销户全教程,剩余的话费还有可能给你退回来!

线上就可以注销手机卡你知道吗&#xff1f;目前三大运营商都开通了线上销户业务了&#xff0c;而且用不完的话费还可以退回来&#xff0c;建议大家点赞收藏起来&#xff0c;以免有需要的时候找不到了&#xff0c;大家好&#xff0c;我是流量卡葫芦妹。 ​ OK&#xff0c;不多废…

【Leetcode】二叉树的最近公共祖先,二叉搜索树转换成排好序的双向链表,前序遍历与中序遍历构造二叉树

一.二叉树的最近公共祖先 链接 二叉树的最近公共祖先 题目再现 『Ⅰ』思路一&#xff1a;转换成相交链表问题 观察上图&#xff0c;节点1和节点4的最近公共祖先是3&#xff0c;这是不是很像相交链表的问题&#xff0c;关于相交链表&#xff0c;曾经我在另一篇文章里写到过&a…

十三、ESP32PS2摇杆(ADC)

1. 运行效果 在上下左右操作PS2摇杆的时候,会检测到数据 2. 滑动电阻

初识http协议,简单实现浏览器和服务器通信

文章目录 认识urlhttp协议格式通信代码验证细节Util.hppprotocol.hppServer.hppServer.cc 结果分析 认识url 平时俗称的 “网址” 其实就是说的 URL&#xff0c;例如在百度上搜索一个C 可以看到这段网址前面有个 https 那么这个就代表着使用的是https协议&#xff0c;现在都是…

八、Spring 整合 MyBatis

文章目录 一、Spring 整合 MyBatis 的关键点二、Spring 整合 MyBatis 的步骤2.1 创建 Maven 项目&#xff0c;并导入相关依赖2.2 配置 Mybatis 部分2.3 配置 Spring 部分2.3 配置测试类 一、Spring 整合 MyBatis 的关键点 1、 将 Mybatis 的 DataSource (数据来源)的创建和管理…

单片机外部晶振故障后自动切换内部晶振——以STM32为例

单片机外部晶振故障后自动切换内部晶振——以STM32为例 作者日期版本说明Dog Tao2023.08.02V1.0发布初始版本 文章目录 单片机外部晶振故障后自动切换内部晶振——以STM32为例背景外部晶振与内部振荡器STM32F103时钟系统STM32F407时钟系统 代码实现系统时钟设置流程时钟源检测…

郭盛华:npm 软件包窃取开发人员的敏感数据

网络安全研究人员在 npm 软件包注册表中发现了一系列新的恶意软件包&#xff0c;这些软件包旨在窃取敏感的开发人员信息。 所有模块的一个共同功能是能够启动 JavaScript&#xff08;“index.js”&#xff09;&#xff0c;该 JavaScript 可以将有价值的信息泄露到远程服务器。…

HCIP 三层交换机

一、实现VLAN间通信 在传统的交换机组网中&#xff0c;默认所有网络都处于同一个广播域&#xff0c;带来了许多问题&#xff0c;VLAN技术的提出&#xff0c;满足了二层组网隔离广播域需求&#xff0c;使得属于不同的VLAN间网络无法通信&#xff0c;但不同VLAN之间又存在着互相…

HTML之表单标签

目录 表单标签 Form表单 定义&#xff1a; 基本语法结构&#xff1a; form属性&#xff1a; enctyoe属性 fieldeset标签 fieldeset属性 legend标签 label标签 优势 label属性 input标签 input属性 input标签中的type属性 text text输入框有以下配套属性 searc bu…

MySQL ROUND、FORMAT数值格式化,以及 返回版本、返回数据库等信息

FORMAT VS ROUND ROUND(数值&#xff0c;n) FORMAT(数值&#xff0c;n) 当 n < 0, FORMAT 整数部分&#xff0c;不会变化&#xff0c; ROUND&#xff0c;整数部分&#xff0c; 根据n的位数&#xff0c;把数值替换成0 当 n>0, 两个效果一样

【数据结构OJ题】移除元素

原题链接&#xff1a;https://leetcode.cn/problems/remove-element/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 方法一&#xff1a;暴力删除&#xff0c;挪动数据覆盖。即遍历整个nums[ ]数组&#xff0c;遇到值等于val的元素&#xff0c;就将整…

模块高可用性部署概述

高可用三种模式 Ⅰ. 主从热备Ⅱ. 哨兵模式Ⅲ. 集群模式Ⅳ. 番外 总结了Redis的几种高可用方式&#xff0c;对于做后端模块的同学来说&#xff0c;可以根据/或是借鉴其思路做自己的模块可用性部署。 Ⅰ. 主从热备 主从热备&#xff0c;是高可用性中最基础的解决方案&#xff0…

详解Quest 2积分与奖励规则

7月28日&#xff0c;在万众期待中&#xff0c;Mysten Labs在Quest门户网站上宣布了Quest 2的到来。经过严密的筹划&#xff0c;本着真实、公平以及用户至上的原则&#xff0c;现在向大家介绍Quest 2的积分规则以及奖励规则。 温馨提示&#xff1a;第一轮Bullshark Quest是一次精…

模拟实现消息队列项目(系列2) -- 项目前期的准备

目录 前言 1. 需求分析 1.1 核心概念 1.2 核心API 1.3 交换机类型 1.4 持久化 1.5 网络通信 1.6 消息应答 2. 模块划分 结语 前言 我们在上一个系列对于消息队列有了初步的认识,那我们明白了消息队列的用途之后,我们就开始进行我们的项目了,首先我们的项目是仿照Rabb…

【Spring Boot】(三)深入理解 Spring Boot 日志

文章目录 前言一、日志文件的作用二、Spring Boot 中的日志2.1 查看输出的日志信息2.2 日志格式二、Spring Boot 中的日志2.1 查看输出的日志信息2.2 日志格式 三、自定义日志输出3.1 日志框架3.2 日志对象的获取3.3 使用日志对象打印日志 四、日志级别4.1 日志级别的作用4.2 日…

springboot配置文件的使用

目录 1.application.properties是springboot默认的配置文件&#xff0c;但是比较繁琐&#xff0c;一般用.yml文件 2. 配置文件的作用 3.配置文件的使用 1.application.properties是springboot默认的配置文件&#xff0c;但是比较繁琐&#xff0c;一般用.yml文件 ①、properti…