Linux jq 命令讲解与实战操作
原创Linux jq 命令讲解与实战操作
jq 是一个轻量级且灵活的命令行 JSON 处理器,它允许用户从命令行或脚本中查询、转换和处理 JSON 数据。jq 的语法类似于表达式语言,让它非常适合进行 JSON 数据的过滤、转换和输出。下面我们将对 jq 命令进行详细的讲解,并提供一些实战操作案例。
1. jq 简介
jq 的设计目标是易懂、飞速,并且能够轻松地处理大型 JSON 数据。它可以在 Linux、macOS 和 Windows 等操作系统上运行。jq 可以直接从标准输入读取 JSON 数据,也可以从文件读取,处理完毕后将最终输出到标准输出或文件中。
2. jq 基本语法
jq 的基本语法如下:
jq [options] [jqfilter] [file]
其中:
options
:可选的命令行选项,用于控制 jq 的行为。jqfilter
:一个或多个 jq 表达式,用于过滤、转换或输出 JSON 数据。file
:可选的文件名,jq 将从该文件读取 JSON 数据。
3. jq 常用选项
以下是一些常用的 jq 选项:
-c
:压缩输出,移除不必要的空白字符。-M
:将 JSON 输出为多行格式。-r
:将 JSON 输出为纯文本,移除引号。-S
:输出时,将空数组输出为空字符串。-s
:将标准输入视为一个 JSON 数组。
4. jq 表达式
jq 表达式是 jq 的核心,它允许用户从 JSON 数据中提取、修改或创建新的数据。以下是一些常见的 jq 表达式类型:
4.1. 基本选择器
基本选择器用于选择 JSON 对象或数组中的特定元素。以下是一些基本选择器的示例:
.key # 选择对象中的 key.keys # 选择对象的所有键
.values # 选择对象的所有值
.[].key # 选择数组中每个对象的 key
.keys[] # 选择数组中每个对象的键
.values[] # 选择数组中每个对象的值
4.2. 过滤器
过滤器用于从 JSON 数据中筛选出符合条件的元素。以下是一些过滤器示例:
filter (.value == "someValue") # 筛选出 value 等于 "someValue" 的元素select (.value != "someValue") # 筛选出 value 不等于 "someValue" 的元素
unique | length # 选择唯一元素的数量
4.3. 转换
转换用于修改 JSON 数据的结构或内容。以下是一些转换示例:
map(.key = "newValue") # 将每个对象的 key 替换为 "newValue"map([.key, .value]) # 将对象演化为包含键和值的数组
reduce([]; . |= .[]) # 将数组中的所有元素合并为一个数组
5. 实战操作
以下是一些使用 jq 的实战操作案例:
5.1. 从 JSON 数据中提取特定值
假设我们有一个 JSON 文件 data.json
,内容如下:
{"name": "John",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Anytown"
}
}
要提取 John 的年龄,可以使用以下 jq 表达式:
echo '{"name": "John", "age": 30, "address": {"street": "123 Main St", "city": "Anytown"}}' | jq '.age'
5.2. 处理 JSON 数组
假设我们有一个包含用户信息的 JSON 数组,内容如下:
[{"name": "Alice", "age": 25},
{"name": "Bob", "age