Linux jq命令超全详解:JSON解析/过滤/转换神器,运维开发必备
1. 命令简介jq 是一个由 stedolan 开发的轻量级、灵活且功能强大的命令行 JSON 处理器。它允许你以高效、可编程的方式解析、过滤、转换和格式化 JSON 数据。jq 使用一种简洁的领域特定语言DSL来构建查询和操作是处理 JSON 数据的理想工具尤其适用于脚本编写、API 响应处理和日志分析。其源代码托管在 GitHub 上jq 项目主页。2. 语法格式jq 的基本语法遵循以下格式jq [选项] 过滤器 [文件...]此外还有两种处理非文件输入的变体语法# 将后续参数作为字符串处理 jq [选项] --args 过滤器 [字符串...] # 将后续参数作为原始 JSON 文本处理 jq [选项] --jsonargs 过滤器 [JSON_TEXTS...][选项]用于修改 jq 行为的各种标志。过滤器一个 jq 表达式定义了如何处理输入的 JSON 数据。最简单的过滤器是 .它表示整个输入对象。[文件...]一个或多个包含 JSON 数据的文件路径。如果未指定文件或文件名为 -jq 将从标准输入stdin读取数据。3. 常用选项及说明选项说明-c紧凑输出。生成单行、无格式化的 JSON而不是美观打印pretty-print的输出。-r原始输出。直接输出字符串内容而不是带引号的 JSON 字符串。对于输出纯文本非常有用。-s吞入slurp模式。将所有的输入项例如多行 JSON 对象读取到一个大数组中然后对整个数组应用过滤器。-n空输入。使用 null 作为单个输入值。通常用于从零开始构造 JSON。-e基于输出设置退出码。如果最后一个输出值非 false 或 null则退出状态码为 0否则为 1。适用于脚本中的条件判断。-R读取原始字符串。将输入视为原始字符串而不是 JSON。常与 -r 和 --slurp 等选项结合处理文本。-C彩色输出。为 JSON 输出着色提高可读性默认行为如果输出到终端。-M单色输出。禁止为 JSON 输出着色。-S排序对象键。在输出时对 JSON 对象的所有键进行排序按字母顺序。--tab使用制表符缩进。在美观打印输出时使用制表符\t进行缩进而不是空格。--arg NAME VALUE定义字符串变量。创建一个名为 $NAME 的变量其值为字符串 VALUE。在过滤器中通过 $NAME 引用。--argjson NAME JSON_TEXT定义 JSON 变量。创建一个名为 $NAME 的变量其值为解析 JSON_TEXT 后得到的 JSON 实体。--slurpfile NAME FILE从文件定义数组变量。读取 FILE 中的所有 JSON 实体每行一个将其作为数组赋值给变量 $NAME。--rawfile NAME FILE从文件定义原始字符串变量。将 FILE 的整个内容作为单个字符串赋值给变量 $NAME。--args剩余参数作为字符串。命令行中此选项之后的所有参数都将被视作字符串参数而不是文件名。在过滤器中通过 $ARGS.positional[] 数组访问。--jsonargs剩余参数作为 JSON。命令行中此选项之后的所有参数都将被解析为 JSON 文本。在过滤器中通过 $ARGS.positional[] 数组访问。--参数终止符。表示选项结束后续所有参数即使以 - 开头也被视为文件名或过滤器的一部分。4. 示例用法以下示例展示了 jq 过滤器的强大功能。假设我们有一个名为 data.json 的文件内容如下{ users: [ {id: 1, name: Alice, active: true, tags: [admin, dev]}, {id: 2, name: Bob, active: false, tags: [user]}, {id: 3, name: Charlie, active: true, tags: [dev, ops]} ], count: 3 }1. 基本访问与格式化# 1.1 美化输出整个JSON jq . data.json # 1.2 紧凑输出 jq -c . data.json # 1.3 获取顶级键的值 jq .count data.json # 输出: 3 jq .users data.json # 输出users数组 # 1.4 访问嵌套属性获取第一个用户的名字 jq .users[0].name data.json # 输出: Alice2. 数组操作# 2.1 遍历数组所有元素 jq .users[] data.json # 2.2 获取数组特定索引的元素 jq .users[1] data.json # 输出Bob的信息 # 2.3 数组切片 (获取前两个用户) jq .users[:2] data.json # 2.4 映射map提取所有用户的名字 jq .users | map(.name) data.json # 输出: [Alice, Bob, Charlie] # 2.5 简化版映射更常用的提取数组字段方法 jq .users[].name data.json3. 过滤与选择# 3.1 选择活跃用户 jq .users[] | select(.active true) data.json # 3.2 选择包含特定标签的用户 jq .users[] | select(.tags | index(dev)) data.json # 找到tags中包含dev的用户 # 3.3 组合条件 (活跃且是开发) jq .users[] | select(.active and (.tags | index(dev))) data.json4. 构造与转换# 4.1 构造新对象 jq .users[] | {username: .name, userId: .id} data.json # 4.2 使用管道组合多个操作计算活跃用户数 jq [.users[] | select(.active)] | length data.json # 4.3 重组数据结构创建用户名到ID的映射 jq .users | map({(.name): .id}) | add data.json5. 使用变量# 5.1 通过命令行传递字符串变量 jq --arg user_name Alice .users[] | select(.name $user_name) data.json # 5.2 传递JSON变量 jq --argjson user_id 1 .users[] | select(.id $user_id) data.json注意事项输入必须是有效的 JSONjq 默认要求输入是严格的 JSON。对于非标准格式如带有尾随逗号的 JSON可以使用 --slurp-s模式或配合 -R 选项进行原始字符串处理后再解析。原始输出模式-r当过滤器输出结果为字符串且你希望直接将其用于管道传递给其他命令或写入文件时使用 -r 选项至关重要否则输出的字符串会带有 JSON 引号。脚本中的条件判断-e 选项允许你根据 jq 的输出结果false 或 null来设置 shell 脚本的退出码这在自动化脚本中非常有用。获取更多Linux学习资料请关注“阿成学长工具包”对话框中输入2647获取