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
相关推荐
xuhe211 小时前
[全流程详细教程]Docker部署ClawBot, 使用GLM4.7, 接入TG Bot实现私人助理. 解决Docker Openclaw Permission Denied问题
linux·docker·ai·github·tldr
Lsir10110_11 小时前
【Linux】进程信号(下半)
linux·运维·服务器
酉鬼女又兒11 小时前
零基础入门Linux指南:每天一个Linux命令_pwd
linux·运维·服务器
云飞云共享云桌面11 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
zl_dfq11 小时前
Linux 之 【多线程】(pthread_xxx、轻量级进程、原生线程库、线程ID、__thread、线程栈、线程与信号、线程与程序替换)
linux
choke23311 小时前
Python 基础语法精讲:数据类型、运算符与输入输出
java·linux·服务器
AZ996ZA12 小时前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php
_OP_CHEN12 小时前
【Linux系统编程】(二十八)深入 ELF 文件原理:从目标文件到程序加载的完整揭秘
linux·操作系统·编译·c/c++·目标文件·elf文件
Fleshy数模12 小时前
MySQL 表创建全攻略:Navicat 图形化与 Xshell 命令行双模式实践
linux·mysql
神梦流13 小时前
GE 引擎的非标准数据流处理:稀疏张量与自定义算子在图优化中的语义保持
linux·运维·服务器