文章目录
1.Overview
本文介绍了如何在 Ubuntu 中安装和使用 jq 工具,它是一个轻量级且灵活的命令行 JSON 处理器,广泛应用于处理 REST API 响应、k8S配置文件分析等场景。
2.安装
sudo apt update
sudo apt install jq
安装完成后,可通过以下命令验证版本:
jq --version
输出:
jq-1.7
3.基础数据筛选
3.1 格式化json
使用 jq ‘.’ 可以对原始 JSON 数据进行格式化,使其更易读。
echo '{"car":{"brand":"Toyota","model":"Corolla","price":20000}}' | jq '.'
输出:
{
"car": {
"brand": "Toyota",
"model": "Corolla",
"price": 20000
}
}
也可以直接读取文件:
jq '.' car.json
调用外部 API 示例:
curl "https://timeapi.io/api/Time/current/zone?timeZone=Asia/Shanghai" | jq '.'
输出:
{
"year": 2025,
"month": 5,
"day": 10,
"hour": 17,
"minute": 35,
"seconds": 37,
"milliSeconds": 285,
"dateTime": "2025-05-10T17:35:37.2857712",
"date": "05/10/2025",
"time": "17:35",
"timeZone": "Asia/Shanghai",
"dayOfWeek": "Saturday",
"dstActive": false
}
3.3 访问属性
通过“.”语法访问嵌套字段:
jq '.car' car.json
输出:
{
"brand": "Toyota",
"model": "Corolla",
"price": 20000
}
访问更具体的字段:
jq '.car.model' car.json
输出:
"Corolla"
同时访问多个字段:
jq '.car.brand,.car.model,.car.price' car.json
输出:
"Toyota"
"Corolla"
20000
键名包含空格时需加双引号:
echo '{ "with space": "hello" }' | jq '."with space"'
输出:
"hello"
4.JSON Arrays
4.1 Iteration(迭代)
数组可以通过 .[] 进行迭代:
echo '["Sun","Moon","Star"]'|jq '.[]'
输出:
"Sun"
"Moon"
"Star"
以下是更复杂的数组对象:
[
{
"brand": "Toyota",
"model": "Corolla",
"price": 20000
},
{
"brand": "Honda",
"model": "Civic",
"price": 18000
},
{
"brand": "Tesla",
"model": "Model 3",
"price": 35000
}
]
提取所有品牌名称:
首先,我们使用 .[] 遍历数组。然后,我们可以使用管道符 | 将数组中的每个对象传递给命令中的下一个过滤器。最后一步是使用 .brand输出每个对象的 brand字段:
jq '.[]|.brand' cars.json
输出:
"Toyota"
"Honda"
"Tesla"
还可以使用稍微简洁一些的版本,直接访问数组中每个对象上的属性:
``bash
jq ‘.[].brand’ cars.json
输出:
```bash
"Toyota"
"Honda"
"Tesla"
4.2 透过索引访问
可以通过索引获取数组中特定元素的字段:
jq '.[1].price' cars.json
输出:
18000
4.3 slicing(切片)
支持切片语法:
echo '[1,2,3,4,5,6,7,8,9,10]' | jq '.[6:9]'
输出:
[
7,
8,
9
]
结合使用多次切片:
echo '[1,2,3,4,5,6,7,8,9,10]' | jq '.[:6]' |jq '.[-2:]'
输出:
[
5,
6
]
[:6]等价[0:6],将取出1,2,3,4,
[-2]意思是从数组倒数第二个元素开始到数组末尾的所有元素
5.使用函數
有时,我们可能希望获取一个对象的键组成的数组,而不是它的值。
5.1 获取键名
可使用 keys 获取对象的所有键名:
jq '.car|keys' car.json
输出:
[
"brand",
"model",
"price"
]
5.2 获取长度
另一个用于数组和对象的实用函数是 length 函数。
我们可以使用这个函数来返回数组的长度,或对象上属性的数量:
jq '.car | length' car.json
输出:
3
还可以对字符串值使用长度函数:
jq '.car.model | length' car.json
输出:
7
5.3 映射值
在 jq 中,map() 是一个常用的函数,它的作用是 对数组中的每个元素应用 ()内的操作,并返回一个新数组。简单来说,map() 会遍历数组中的每个元素,然后对每个元素执行相同的操作,最后将结果收集成一个新的数组。
检查 car.json 文件中的每个元素是否都包含 “model” 这个键,并返回一个布尔值数组,表示每个元素是否有该键。
jq 'map(has("model"))' car.json
输出:
true
- map(…):对数组的每个元素应用括号内的表达式。
- has(“model”):检查每个对象是否包含 “model” 这个键,返回 true 或 false。
加法操作:
jq 'map(.price+2)' car.json
输出:
[
20002
]
5.4 Min与Max
如果我们需要找到输入数组的最小或最大元素,我们可以利用 min 和 max 函数
min操作:
jq '[.[].price]|min ' cars.json
输出:
18000
max操作:
jq '[.[].price]|max' cars.json
输出:
35000
5.5 筛选值
条件筛选:
jq '.[]| select(.price>20000)' cars.json
输出:
{
"brand": "Tesla",
"model": "Model 3",
"price": 35000
}
匹配特定值:
jq '.[]| select(.model=="Civic")' cars.json
输出:
{
"brand": "Honda",
"model": "Civic",
"price": 18000
}
复合条件:
jq '.[]| select(.model=="Civic" and .price >= 18000)' cars.json
输出:
{
"brand": "Honda",
"model": "Civic",
"price": 18000
}
通过键名前缀筛选:
jq '.[]|to_entries[]|select(.key|startswith("brand")).value' cars.json
输出:
"Toyota"
"Honda"
"Tesla"
5.6 使用正则表达式
支持用 test() 匹配正则表达式:
jq '.[]|select(.brand|test("^H"))' cars.json
输出:
{
"brand": "Honda",
"model": "Civic",
"price": 18000
}
5.7 查找唯一值
提取不重复的字段值:
jq 'map(.model)|unique' cars.json
5.8 从 JSON 中删除key
使用 del 删除字段:
jq 'del(.car.brand)' car.json
输出:
{
"car": {
"model": "Corolla",
"price": 20000
}
}
6. 转换Json
在处理嵌套 JSON 时,我们常常只关心其中的部分字段。下面是一个典型例子,演示如何从嵌套结构中提取每本书的标题和摘要,并生成一个简洁的数组:
示例数据(books.json):
{
"library": {
"books": [
{
"bk101": {
"id": "bk101",
"title": "XML Developer's Guide",
"summary": "An in-depth look at creating applications with XML."
}
},
{
"bk102": {
"id": "bk102",
"title": "Midnight Rain",
"summary": "A former architect battles corporate zombies, an evil sorceress, and her own childhood."
}
}
]
}
}
提取命令:
jq '.library.books|[.[]|map(.)|.[]|{book_title:.title,book_summary:.summary}]' books.json
输出:
[
{
"book_title": "XML Developer's Guide",
"book_summary": "An in-depth look at creating applications with XML."
},
{
"book_title": "Midnight Rain",
"book_summary": "A former architect battles corporate zombies, an evil sorceress, and her own childhood."
}
]
7.总结
本文系统介绍了如何在 Ubuntu 系统中安装并使用 jq 工具对 JSON 数据进行高效处理。我们从基础的格式化展示和属性访问入手,逐步扩展到数组遍历、索引访问、切片操作,以及应用 jq 提供的各种函数进行键名提取、长度计算、映射处理、值筛选、正则匹配、唯一值提取和键删除等高级功能。通过配套的实际命令与输出示例,读者可以快速掌握 jq 的核心用法,灵活应对日常 JSON 数据的读取、查询与变换任务。
jq 是处理结构化数据时非常有力的工具,特别适合在命令行环境中对 API 返回值、日志、配置文件等进行快速分析与操作。建议在实际工作中多加练习,熟悉其过滤器与函数组合的使用方式,充分发挥其强大的文本处理能力。