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
相关推荐
鹏大师运维1 小时前
为什么信创电脑装软件总提示“软件包架构不匹配”?
linux·运维·架构·国产化·麒麟·deb·统信uos
鹤落晴春3 小时前
【Linux复习】管理SELinux安全性
linux·运维·服务器
yz_aiks3 小时前
Linux Jar包配置Systemd自启动实战:从排查到配置全流程
linux·python·jar·自启动·systemd
bjzhang754 小时前
CentOS下安装MySQL详解
linux·mysql·centos
Jason_chen6 小时前
Linux 6.2 音频机制深度解析:AI驱动的低延迟音频与零信任音频安全架构
linux
下午写HelloWorld6 小时前
Linux系统及Ubuntu常用指令
linux·ubuntu·操作系统
weixin_523185327 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
凡人叶枫8 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
云栖梦泽8 小时前
玩转RK3506SDK
linux·嵌入式硬件
Java面试题总结9 小时前
Linux-Ubantu-贴士-apt的地盘
linux·运维·服务器