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

2023-10-27

一、概述

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 包含 contains 的 json 格式查询

    我在 ansible 中有以下 json 输出 active transaction null cores 4 hostname alpha auth wb01 active transaction null cores 4 hostnam
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • jolt变换后json对象的排序

    Input The input json object 所需输出 Event1 Value1 Event2 collection of json objects Event3 The input json object 所以基本上输入 js
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • 从bigquery中的json字符串中提取键和值,其中json文档中没有指定的键

    我在 bigquery 中有一个表 其中有对象 对于每个对象 我都有一些字符串化的 json 在 json 中 示例行如下所示 ObjectID 1984931229 indexed abstract IndexLength 123 Inv
  • 将 PDF 转换为 600dpi 的 TIFF 和 jpg 96 dpi

    我想使用 ImageMagick 从 Python 脚本将 pdf 转换为 600 dpi 的 tiff 和 96 dpi 的 jpg 我使用 imagemagick 命令行完成了这项任务 但我想使用python中的Imagemagick将
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • json_encode 返回 NULL?

    由于某种原因 项目 描述 返回NULL使用以下代码 这是我的数据库的架构 CREATE TABLE staff id int 11 NOT NULL AUTO INCREMENT name longtext COLL
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • 如何在 Swift 3 中解析 JSON 数组 [重复]

    这个问题在这里已经有答案了 我从 Socket 获取了一些我想访问的数据 但收到错误消息 指出每次都无法将 NSArray 转换为 NSDictionary struct SocketEventHandler let event Strin
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • CodeIgniter 控制器 - JSON - AJAX

    我正在尝试通过 AJAX 使用 CodeIgniter 发送表单构建 并尝试使用 JSON 获取响应 但是 我只在打开开发人员选项卡时看到响应 我什至不确定这是否实际上是响应 因为它显示了两个 json 数据 它所显示的只是加载旋转器 然后
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • Hive:如何分解嵌入 CSV 文件中的 JSON 列?

    从 CSV 文件 带有标题和管道分隔符 中 我得到了以下两个内容 其中包含一个 JSON 列 内部有一个集合 如下所示 第一种情况 使用没有名称的 JSON 集合 ProductId IngestTime ProductOrders 918
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是

随机推荐