Linux命令-jq(能够高效地解析、过滤、查询和操作JSON数据)

🧭 说明

jq是一个功能强大的命令行JSON处理器,能够高效地解析、过滤、查询和操作JSON数据。下面这个表格汇总了它的主要功能类别和常用命令。

功能类别 常用命令/过滤器 说明
基础查询 ., .["key"], .[index] 获取JSON数据本身、特定字段值或数组元素。
数组操作 .[], .[index], .[start:end] 展开数组、访问特定元素或进行切片。
数据筛选 select(condition), map(expression) 根据条件过滤数据,或对数组每个元素进行转换。
构造与转换 { }, [ ], +=, del() 创建新对象/数组,修改字段值或删除字段。
聚合计算 length, keys, has("key"), add 计算长度、获取键名、检查键存在性、求和等。
管道操作 ` `

💡 核心功能详解

  • 格式化输出 :最基本的用法是使用 . 过滤器,它可以将输入的JSON数据美观地打印出来。这在查看压缩在一行的JSON数据时特别有用。

    bash 复制代码
    echo '{"name":"Alice","age":30}' | jq '.'
  • 提取特定字段 :通过 .fieldName 可以直接获取对象中的字段值。对于嵌套结构,可以使用点号链式访问,如 .user.profile.name。使用 -r 选项可以输出原始字符串(去掉JSON引号),方便直接在shell脚本中使用。

    bash 复制代码
    echo '{"user":{"name":"Alice"}}' | jq -r '.user.name' # 输出:Alice
  • 操作JSON数组

    • 展开迭代 :使用 .[] 可以将数组展开,使其中的每个元素独立地通过后续管道。

      bash 复制代码
      echo '[{"name":"Alice"},{"name":"Bob"}]' | jq '.[]'
    • 条件筛选 :结合 select 函数可以根据条件过滤数组元素。

      bash 复制代码
      # 筛选出age大于25的对象
      echo '[{"name":"Alice","age":30},{"name":"Bob","age":20}]' | jq '.[] | select(.age > 25)'
    • 映射转换 :使用 map 函数可以对数组中的每个元素应用相同的操作。

      bash 复制代码
      # 提取所有对象的name字段,组成新数组
      echo '[{"name":"Alice"},{"name":"Bob"}]' | jq 'map(.name)'
  • 构造与修改JSON:jq不仅可以查询,还能创建和修改JSON数据。

    • 构造新对象 :使用 { } 可以构造新的JSON对象。

      bash 复制代码
      echo '{"firstName":"John","lastName":"Doe"}' | jq '{fullName: .firstName + " " + .lastName}'
    • 修改字段值 :使用 |= 运算符可以更新字段的值。

      bash 复制代码
      # 将version字段的值增加1
      jq '.version |= .+1' data.json
    • 删除字段 :使用 del 函数可以删除指定的字段。

      bash 复制代码
      jq 'del(.tempData)' data.json

⚠️ 实用技巧与注意事项

  • 处理外部变量 :在shell脚本中,可以使用 --arg 选项将shell变量传递给jq过滤器。

    bash 复制代码
    name="Alice"
    echo '{}' | jq --arg n "$name" '.name = $n'
  • 控制输出格式 :除了 -r-c 选项可以输出紧凑的单行JSON,适合日志记录。

  • 处理大型文件 :处理非常大的JSON文件时,避免使用 -s(slurp)选项一次性将整个文件读入内存,可以考虑使用 --stream 选项进行流式解析。

  • 错误处理 :使用 ? 操作符可以进行安全访问,当路径不存在时不会报错,而是返回 null。结合 // 运算符可以提供默认值。

    bash 复制代码
    jq '.maybeMissingKey? // "default value"' data.json
相关推荐
疯狂吧小飞牛6 小时前
GPG基础指令
linux·服务器·网络
C++ 老炮儿的技术栈6 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
todoitbo7 小时前
用虚拟局域网打通 Win/Mac/Linux 三端:跨设备协作的实用方案
linux·运维·macos
源远流长jerry7 小时前
RDMA 基本操作类型详解:从双端通信到单端直访
linux·网络·tcp/ip·ip
Sylvia-girl8 小时前
Linux下的基本指令1
linux·运维·服务器
wyt5314299 小时前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis
17(无规则自律)9 小时前
【Linux驱动实战】:字符设备之ioctl与mutex全解析
linux·c语言·驱动开发·嵌入式硬件
天赐学c语言10 小时前
Linux - 应用层自定义协议与序列/反序列化
linux·服务器·网络·c++
jarreyer10 小时前
CentOS 7 无法使用 yum 安装软件
linux·运维·centos
薛定谔的悦11 小时前
告别传统BMS!深度解读阳光电源 BM^2T 电池管理技术白皮书
linux·能源·储能·bms·ems