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
相关推荐
qiuiuiu4134 小时前
正点原子RK3568学习日志21-实验1-字符设备点亮led
linux·学习
fai厅的秃头姐!4 小时前
01-python基础-day01Linux基础
linux
无小道4 小时前
OS中的线程
linux·线程·进程·os·线程库·用户级线程库·线程使用
Q16849645154 小时前
红帽Linux-文件权限管理
linux·运维·服务器
这儿有一堆花4 小时前
Linux 内网环境构建与配置深度解析
linux·数据库·php
fiveym4 小时前
CI/CD 核心原则 + 制品管理全解析:落地要求 + 存储方案
linux·运维·ci/cd
VekiSon5 小时前
ARM架构——从嵌入式系统底层到指令执行解析
linux·arm开发·架构
wdfk_prog5 小时前
[Linux]学习笔记系列 -- [driver][base]container
linux·笔记·学习
郝学胜-神的一滴5 小时前
Linux条件变量:线程同步的利器
linux·服务器·开发语言·c++·程序人生·软件工程
橘颂TA5 小时前
【Linux 网络】应用层自定义协议和序列化
linux·运维·服务器·网络·tcp·结构与算法·序列化和反序列