文章目录
- 1.简介
- 2.格式
- 3.选项
- 4.示例
- 5.小结
- 参考文献
1.简介
jq 是一个轻量级、灵活的命令行 JSON 处理器,类似于文本处理工具 sed、awk、grep 等。
jq 使用用可移植的 C 语言编写的,没有运行时依赖,允许您轻松地切片、过滤、映射和转换结构化数据。
2.格式
jq [options] <filter> [files...]
- 如果没有指定输入文件,jp 会从标准输入读取数据。
- 如果 JSON 数据是来自文件,可以将其作为参数传递。
3.选项
-c, --compact-output压缩输出,使其输出为单行格式。
--color-output / -C 或 --monochrome-output / -M默认情况下,如果写入到终端,jq输出彩色JSON。即使写入管道或文件,也可以使用-C强制生成颜色,并使用-M禁用颜色。当 NO_COLOR 环境变量不为空时,jq 默认禁用彩色输出,但您可以通过 -C 启用它。
-f, --from-file filename指定输入的 JSON 文件。
-r, --raw-output输出结果不带引号,这对于让 jq 过滤器与非基于 json 的系统对话非常有用。
-h, --help显示帮助信息。
-V, --version显示版本信息。
4.示例
假设有以下 JSON 数据,保存在 data.json 文件。
{"name": "John","age": 30,"cars": [{"name": "Ford", "models": ["Fiesta", "Focus", "Mustang"]},{"name": "BMW", "models": ["320", "X3", "X5"]},{"name": "Fiat", "models": ["500", "Panda"]}]
}
(1)基本查询。
查询顶级字段:
jq '.name' data.json# 输出
"John"jp '.age' data.json# 输出
30
. 表示当前上下文(根对象)。
.name 表示从根对象获取 name 属性。
(2)嵌套查询。
比如想查询数组中第 0 个对象的 name 属性:
jq '.cars[0].name' data.json# 输出
"Ford"
如果你想查询数组中所有对象的 name 属性,并以一个数组形式输出,可以使用 jq 的 map 函数来处理。map 会应用一个过滤器到数组的每个元素,并返回一个包含所有结果的数组。
jq '.cars | map(.name)' data.json# 输出
["Ford","BMW","Fiat"
]
(3)修改字段。
假设我们想修改某个字段的值。比如将年龄改为 26。
jq '.age = 26' data.json
我们也可以对数组中的每个元素进行修改。
假设你想将所有汽车的 model 名称转换为大写,可以使用 map 和 jq 内置的字符串操作函数 :
jq '.cars | map(.models |= map(ascii_upcase))' data.json# 输出
[{"name": "Ford","models": ["FIESTA","FOCUS","MUSTANG"]},{"name": "BMW","models": ["320","X3","X5"]},{"name": "Fiat","models": ["500","PANDA"]}
]
其中 |= 用于修改对象的字段值。
(4)过滤数组元素。
我们可以提取 name 为 BMW 的汽车:
jq '.cars | map(select(.name == "BMW"))' data.json# 输出
[{"name": "BMW","models": ["320","X3","X5"]}
]
如果只想提取第一个符合条件的对象,可以使用:
jq '.cars | map(select(.name == "BMW")) | .[0]' data.json# 输出
{"name": "BMW","models": ["320", "X3", "X5"]
}
(5)格式化输出并启用颜色高亮显示。
jq -C . data.json
注意 jq 打印 JSON 文件时,必须提供一个过滤器,其中 . 表示整个输入。
(6)压缩成单行格式输出。
jq 的 -c 选项用于将输出压缩成单行格式,去掉多余的空格和换行符。这个选项通常用于在输出 JSON 时,去除格式化和缩进,使输出更紧凑,便于进一步处理或存储。
jq -c '.cars' data.json# 输出[{"name":"Ford","models":["Fiesta","Focus","Mustang"]},{"name":"BMW","models":["320","X3","X5"]},{"name":"Fiat","models":["500","Panda"]}]
(7)输出不带引号。
jq -r '.name' data.json# 输出
John
假设你想输出所有汽车的 models 数组中所有的模型名称,并且去掉引号,可以使用:
jq -r '.cars[].models[]' data.json# 输出
"Fiesta"
"Focus"
"Mustang"
"320"
"X3"
"X5"
"500"
"Panda"
5.小结
jq 的最早版本是在 2010 年由 Stephen Dolan 开发的。Dolan 是一位软件工程师,致力于开发实用的命令行工具。他的目标是创建一个能够高效处理 JSON 数据的工具,类似于 sed、awk 和 grep 这类 Unix 工具,但专门针对 JSON 格式。
jq 从一个个人开发的小工具开始,逐步发展成了广受欢迎、强大的 JSON 处理工具。它的灵活性、扩展性以及高效性使其成为开发者、运维人员、数据科学家等不同领域的必备工具之一。
jq 拥有丰富的指南和手册,可以在其官网寻找到你所需的帮助。
参考文献
jq github
Official Documentation: jqlang.org
Try jq Online: play.jqlang.org