linux 下 jq 命令处理json文件的示例 —— 筑梦之路

简介

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"
  }
]
  1. 选择字段
bash 复制代码
查询并选择所有人的姓名:

cat data.json | jq '.[].name'
输出:

"Alice"
"Bob"
"Charlie"
  1. 过滤
bash 复制代码
选择年龄大于 25 岁的人的姓名和城市:

cat data.json | jq '.[] | select(.age > 25) | .name, .city'
输出:

"Bob"
"Los Angeles"
  1. 遍历数组
bash 复制代码
遍历并输出所有人的年龄:

cat data.json | jq '.[] | .age'
输出:

25
30
22
  1. 组合操作
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"
}
  1. 修改字段值
bash 复制代码
修改年龄字段的值为 26:

cat data.json | jq '.age = 26'
输出:

{
  "name": "Alice",
  "age": 26,
  "city": "New York"
}
  1. 创建新字段
bash 复制代码
添加一个新的字段 country 并设置其值为 "USA":

cat data.json | jq '.country = "USA"'
输出:

{
  "name": "Alice",
  "age": 25,
  "city": "New York",
  "country": "USA"
}
  1. 组合操作
bash 复制代码
修改年龄字段的值为 26,并添加一个新的字段 country:

cat data.json | jq '.age = 26 | .country = "USA"'
输出:

{
  "name": "Alice",
  "age": 26,
  "city": "New York",
  "country": "USA"
}
  1. 条件修改
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
}
  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'
输出:

15
5
50
2
  1. 比较运算
bash 复制代码
比较字段值,返回布尔结果:

cat data.json | jq '.a > .b'
cat data.json | jq '.a >= .c'
cat data.json | jq '.b < .c'
输出:

true
false
true
  1. 逻辑运算
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
  1. 条件运算
cpp 复制代码
使用 if 和 then 进行条件运算:

cat data.json | jq 'if .a > 10 then "Greater" else "Less or equal" end'
输出:

"Less or equal"


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

变量和条件

bash 复制代码
as $variable: 将结果保存到变量中。

if condition then ... else ... end: 条件语句。

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

{
  "name": "Alice",
  "age": 25,
  "city": "New York"
}
  1. 使用变量
bash 复制代码
将字段值存储到变量中,并在输出中使用变量:

cat data.json | jq '.age as $age | "Name: \(.name), Age: \($age)"'
输出:

"Name: Alice, Age: 25"
  1. 条件语句
bash 复制代码
使用 if 和 then 进行条件判断:

cat data.json | jq 'if .age > 18 then "Adult" else "Minor" end'
输出:

"Adult"
  1. 条件和变量组合
cpp 复制代码
结合条件语句和变量,根据年龄输出不同的消息:

cat data.json | jq 'if .age > 18 then "Name: \(.name), Status: Adult" else "Name: \(.name), Status: Minor" end'
输出:

"Name: Alice, Status: Adult"
  1. 使用条件操作修改数据
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 数据,可以根据文档和教程进一步学习。

函数

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

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

{
  "name": "Alice",
  "age": 25,
  "city": "New York",
  "scores": [85, 90, 78, 95]
}
  1. length函数
bash 复制代码
获取数组的长度:

cat data.json | jq '.scores | length'
输出:

4
  1. map函数
bash 复制代码
对数组中的每个元素应用转换操作:

cat data.json | jq '.scores | map(. * 2)'
输出:

[170,180,156,190]
  1. 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]]
  1. 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]}
]
  1. 自定义函数
bash 复制代码
使用自定义函数进行操作:

cat data.json | jq 'def average: reduce .[] as $item (0; . + $item) / length; .scores | average'
输出:

87

这些是一些常见的 jq 命令参数和选项,可以帮助你进行 JSON 数据的查询、过滤、修改和转换。更多内容查看官方文档。

相关推荐
Mephisto.java2 分钟前
【大数据学习 | kafka高级部分】kafka的文件存储原理
大数据·sql·oracle·kafka·json
待磨的钝刨3 小时前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
小百菜17 小时前
dom4j实现xml转map,xml转json字符串
xml·json·xml转map·xml转json
yuchangchenTT20 小时前
就是这个样的粗爆,手搓一个计算器:JSON格式化计算器
前端·json·365快速计算器·在线计算器
engchina20 小时前
Python代码解析:处理JSON数据并导入Neo4j数据库
数据库·python·json
Mephisto.java1 天前
【大数据学习 | HBASE】hbase的整体架构
大数据·sql·oracle·json·hbase·database
东方巴黎~Sunsiny1 天前
优雅的遍历JSONArray,获取里面的数据
java·json
API快乐传递者2 天前
用 Python 爬取淘宝商品价格信息时需要注意什么?
java·开发语言·爬虫·python·json
Mephisto.java2 天前
【大数据学习 | kafka】kafka的偏移量管理
大数据·sql·oracle·sqlite·json·hbase
灰色人生qwer2 天前
JSON parse error: Unexpected end-of-input in VALUE_STRING
json