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

一、概述

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

GitHub 地址:github.com/stedolan/jq

jq 官方网站: stedolan.github.io/jq/

二、jq 命令安装

bash 复制代码
yum install epel-release
yum install -y jq

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

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

1)基本用法

bash 复制代码
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 数据:

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

1、选择字段

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

bash 复制代码
cat data.json | jq '.[].name'

输出:

bash 复制代码
"Alice"
"Bob"
"Charlie"

2、过滤

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

bash 复制代码
cat data.json | jq '.[] | select(.age > 25) | .name, .city'

输出:

bash 复制代码
"Bob"
"Los Angeles"

3、遍历数组

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

bash 复制代码
cat data.json | jq '.[] | .age'

输出:

bash 复制代码
25
30
22

4、组合操作

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

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

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

4)修改和创建

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

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

bash 复制代码
{
  "name": "Alice",
  "age": 25,
  "city": "New York"
}

1、修改字段值:

修改年龄字段的值为 26:

bash 复制代码
cat data.json | jq '.age = 26'

输出:

bash 复制代码
{
  "name": "Alice",
  "age": 26,
  "city": "New York"
}

2、创建新字段:

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

bash 复制代码
cat data.json | jq '.country = "USA"'

输出:

bash 复制代码
{
  "name": "Alice",
  "age": 25,
  "city": "New York",
  "country": "USA"
}

3、组合操作:

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

bash 复制代码
cat data.json | jq '.age = 26 | .country = "USA"'

输出:

bash 复制代码
{
  "name": "Alice",
  "age": 26,
  "city": "New York",
  "country": "USA"
}

4、条件修改

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

bash 复制代码
cat data.json | jq 'if .age < 30 then .city = "Chicago" else . end'

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

bash 复制代码
{
  "name": "Alice",
  "age": 25,
  "city": "Chicago"
}

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

5)运算符

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

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

bash 复制代码
{
  "a": 10,
  "b": 5,
  "c": 15
}

1、数值运算

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

bash 复制代码
cat data.json | jq '.a + .b'
cat data.json | jq '.a - .b'
cat data.json | jq '.a * .b'
cat data.json | jq '.a / .b'

输出:

bash 复制代码
15
5
50
2

2、比较运算:

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

bash 复制代码
cat data.json | jq '.a > .b'
cat data.json | jq '.a >= .c'
cat data.json | jq '.b < .c'

输出:

bash 复制代码
true
false
true

3、逻辑运算:

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

bash 复制代码
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)'

输出:

bash 复制代码
true
true
false

4、条件运算:

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

bash 复制代码
cat data.json | jq 'if .a > 10 then "Greater" else "Less or equal" end'

输出:

bash 复制代码
"Less or equal"

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

6)变量和条件

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

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

bash 复制代码
{
  "name": "Alice",
  "age": 25,
  "city": "New York"
}

1、使用变量:

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

bash 复制代码
cat data.json | jq '.age as $age | "Name: \(.name), Age: \($age)"'

输出:

bash 复制代码
"Name: Alice, Age: 25"

2、条件语句:

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

bash 复制代码
cat data.json | jq 'if .age > 18 then "Adult" else "Minor" end'

输出:

bash 复制代码
"Adult"

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

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

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

输出:

bash 复制代码
"Name: Alice, Status: Adult"

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

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

bash 复制代码
cat data.json | jq 'if .age > 30 then .city = "Chicago" else . end'

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

bash 复制代码
{
  "name": "Alice",
  "age": 25,
  "city": "New York"
}

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

7)函数

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

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

bash 复制代码
{
  "name": "Alice",
  "age": 25,
  "city": "New York",
  "scores": [85, 90, 78, 95]
}

1、length 函数:

获取数组的长度:

bash 复制代码
cat data.json | jq '.scores | length'

输出:

bash 复制代码
4

2、map 函数:

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

bash 复制代码
cat data.json | jq '.scores | map(. * 2)'

输出:

bash 复制代码
[170,180,156,190]

3、keys 和 values 函数:

获取对象的键和值:

bash 复制代码
cat data.json | jq '. | keys'
cat data.json | jq '. | values'

输出:

bash 复制代码
["name","age","city","scores"]
["Alice",25,"New York",[85,90,78,95]]

4、to_entries 函数:

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

bash 复制代码
cat data.json | jq '. | to_entries'

输出:

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

5、自定义函数:

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

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

输出:

bash 复制代码
87

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


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

相关推荐
AnalogElectronic40 分钟前
linux 测试网络和端口是否连通的命令详解
linux·网络·php
Edward111111111 小时前
4月28日防火墙问题
linux·运维·服务器
子琦啊2 小时前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法
AOwhisky3 小时前
Kubernetes 学习笔记:集群管理、命名空间与 Pod 基础
linux·运维·笔记·学习·云原生·kubernetes
小龙在慢慢变强..4 小时前
目录结构(FHS 标准)
linux·运维·服务器
2035去旅行4 小时前
嵌入式开发,如何选择C标准库
linux·arm开发
刘延林.4 小时前
win11系统下通过 WSL2 安装Ubuntu 24.04 使用RTX 5080 GPU
linux·运维·ubuntu
CodeOfCC5 小时前
Linux 嵌入式arm64安装openclaw
linux·运维·服务器
宵时待雨6 小时前
linux笔记归纳3:linux开发工具
linux·运维·笔记
magrich6 小时前
安装NoMachine并解决无外接显示器桌面黑屏
linux·运维·服务器