简介
jq
是一个强大的命令行工具,用于处理JSON
格式的数据。它可以帮助你查询、过滤、修改和处理JSON
数据,使得在命令行环境下处理JSON
变得非常方便。
参考资料:
GitHub 地址:https://github.com/stedolan/jq
jq 官方网站: https://stedolan.github.io/jq/
语法和命令使用示例
jq
命令有很多参数和选项,可以帮助你处理和转换JSON
数据。以下是一些常用的jq
命令参数和选项:
bash基本语法 jq [options] [filter] [file] options: 可选参数,用于指定 jq 的选项。 filter: 必需参数,用于指定 JSON 数据的查询和转换操作。 file: 可选参数,要处理的 JSON 数据文件。
bash常用选项 -r: 输出原始格式,而不是 JSON 编码。 -c: 输出时将结果按行分隔。 -s: 将输入视为多个 JSON 对象,用于处理多个 JSON 对象的数组。
bash查询过滤 .: 表示当前对象,用于访问字段或属性。 .fieldName: 选择指定字段的值。 []: 用于遍历数组元素。 select(condition): 根据条件选择元素。 map(transform): 对数组中的每个元素应用转换操作。
当使用 jq 进行查询和过滤 JSON 数据时,你可以根据需要执行各种操作。以下是一些常见的查询和过滤示例,假设我们有以下 JSON 数据:
bash[ { "name": "Alice", "age": 25, "city": "New York" }, { "name": "Bob", "age": 30, "city": "Los Angeles" }, { "name": "Charlie", "age": 22, "city": "Chicago" } ]
- 选择字段
bash查询并选择所有人的姓名: cat data.json | jq '.[].name' 输出: "Alice" "Bob" "Charlie"
- 过滤
bash选择年龄大于 25 岁的人的姓名和城市: cat data.json | jq '.[] | select(.age > 25) | .name, .city' 输出: "Bob" "Los Angeles"
- 遍历数组
bash遍历并输出所有人的年龄: cat data.json | jq '.[] | .age' 输出: 25 30 22
- 组合操作
bash选择年龄在 25 到 30 岁之间的人的姓名和城市,并按照姓名排序: cat data.json | jq '.[] | select(.age >= 25 and .age <= 30) | .name, .city' | sort "Alice" "New York" "Bob" "Los Angeles" 这些只是一些基本的查询和过滤示例。jq 支持更多的操作和功能,你可以根据需要进行组合和定制。请根据你的数据和需求来调整和扩展这些示例。
修改和创建
bash.fieldName = value: 修改字段的值。 del(.fieldName): 删除指定字段。 .newField = value: 创建新的字段。 使用 jq 进行 JSON 数据的修改和创建可以帮助你更新数据或添加新的字段。以下是一些示例,假设我们有以下 JSON 数据: { "name": "Alice", "age": 25, "city": "New York" }
- 修改字段值
bash修改年龄字段的值为 26: cat data.json | jq '.age = 26' 输出: { "name": "Alice", "age": 26, "city": "New York" }
- 创建新字段
bash添加一个新的字段 country 并设置其值为 "USA": cat data.json | jq '.country = "USA"' 输出: { "name": "Alice", "age": 25, "city": "New York", "country": "USA" }
- 组合操作
bash修改年龄字段的值为 26,并添加一个新的字段 country: cat data.json | jq '.age = 26 | .country = "USA"' 输出: { "name": "Alice", "age": 26, "city": "New York", "country": "USA" }
- 条件修改
bash如果年龄小于 30,则将城市修改为 "Chicago": cat data.json | jq 'if .age < 30 then .city = "Chicago" else . end' 输出(由于年龄小于 30,城市被修改): { "name": "Alice", "age": 25, "city": "Chicago" } 这些示例演示了如何使用 jq 修改和创建 JSON 数据。你可以根据需要进行组合和调整,以实现你的需求。记住,jq 提供了强大的功能,可以进行更复杂的操作,可以根据文档和教程进一步学习。
运算符
bash+, -, *, /: 数值运算。 ==, !=, <, >, <=, >=: 比较运算。 and, or, not: 逻辑运算。 jq 支持多种运算符,用于在 JSON 数据中执行数值运算、比较和逻辑操作。以下是一些常见的 jq 运算符示例,假设我们有以下 JSON 数据: { "a": 10, "b": 5, "c": 15 }
- 数值运算
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' 输出: 15 5 50 2
- 比较运算
bash比较字段值,返回布尔结果: cat data.json | jq '.a > .b' cat data.json | jq '.a >= .c' cat data.json | jq '.b < .c' 输出: true false true
- 逻辑运算
bash执行逻辑 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
- 条件运算
cpp使用 if 和 then 进行条件运算: cat data.json | jq 'if .a > 10 then "Greater" else "Less or equal" end' 输出: "Less or equal" 这些示例展示了 jq 中的一些常见运算符的用法。你可以根据需要进行更复杂的运算和组合操作,以实现你的需求。在处理 JSON 数据时,jq 提供了广泛的功能来执行各种操作。
变量和条件
bashas $variable: 将结果保存到变量中。 if condition then ... else ... end: 条件语句。 在 jq 中,你可以使用变量和条件语句来处理和转换 JSON 数据。以下是一些示例,说明如何在 jq 中使用变量和条件语句,假设我们有以下 JSON 数据: { "name": "Alice", "age": 25, "city": "New York" }
- 使用变量
bash将字段值存储到变量中,并在输出中使用变量: cat data.json | jq '.age as $age | "Name: \(.name), Age: \($age)"' 输出: "Name: Alice, Age: 25"
- 条件语句
bash使用 if 和 then 进行条件判断: cat data.json | jq 'if .age > 18 then "Adult" else "Minor" end' 输出: "Adult"
- 条件和变量组合
cpp结合条件语句和变量,根据年龄输出不同的消息: cat data.json | jq 'if .age > 18 then "Name: \(.name), Status: Adult" else "Name: \(.name), Status: Minor" end' 输出: "Name: Alice, Status: Adult"
- 使用条件操作修改数据
bash根据年龄字段的值,如果大于 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 数据,可以根据文档和教程进一步学习。
函数
bashjq 支持一些内置函数,如 length, keys, values, tostring 等,用于操作和处理 JSON 数据。 在 jq 中,你可以使用内置的函数来处理和转换 JSON 数据。以下是一些常见的 jq 函数示例,假设我们有以下 JSON 数据: { "name": "Alice", "age": 25, "city": "New York", "scores": [85, 90, 78, 95] }
- length函数
bash获取数组的长度: cat data.json | jq '.scores | length' 输出: 4
- map函数
bash对数组中的每个元素应用转换操作: cat data.json | jq '.scores | map(. * 2)' 输出: [170,180,156,190]
- keys 和 values 函数
bash获取对象的键和值: cat data.json | jq '. | keys' cat data.json | jq '. | values' 输出: ["name","age","city","scores"] ["Alice",25,"New York",[85,90,78,95]]
- to_entries 函数
bash将对象转换为键值对数组: 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]} ]
- 自定义函数
bash使用自定义函数进行操作: cat data.json | jq 'def average: reduce .[] as $item (0; . + $item) / length; .scores | average' 输出: 87
这些是一些常见的 jq 命令参数和选项,可以帮助你进行 JSON 数据的查询、过滤、修改和转换。更多内容查看官方文档。