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
相关推荐
爱吃香菜的初学者23 分钟前
十四.Linux——消息队列
linux·运维·开发语言
Apipi*7 小时前
30天速通Linux 第六章信号及信号处理
linux·运维·信号处理
天启HTTP8 小时前
爬虫防封核心原理:IP轮换机制与风控规避逻辑
linux·服务器·网络·爬虫·tcp/ip
广州浮点FLOATLIC11 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
BLUcoding11 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
AIgorithmGEEK11 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil20811 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)11 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter62511 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
xh didida13 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++