news 2026/7/14 15:46:04

jq命令详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
jq命令详解

jq命令详解

API 调试、CI 日志、Kuberneteskubectl输出、配置文件巡检——碰到 JSON 时,grep容易误伤引号与嵌套,jq用声明式过滤器直接查询、裁剪、重组 JSON,是命令行下的标配工具。

速览

  • 语法:jq '<过滤器>' file.jsoncat file.json | jq '<过滤器>'
  • 取字段:.name.address.city;数组:.items[0].items[]
  • 过滤:select(.age > 20);构造:{user: .name}
  • 常用选项:-r去引号、-c压缩一行、-s多行 JSON 合并为数组
  • 表达式必须加引号:jq '.name'✅,jq .name❌(shell 会拆参数)

核心结论(30 秒版)

  1. 只看结构jq .jq -C .彩色格式化。
  2. 提一个字段给脚本jq -r '.name'
  3. 筛数组.items[] | select(.status == "ok")
  4. 改字段不改文件jq '.age += 1'输出到新文件或管道。
  5. JSON 用jq,纯文本行用grep;别用 grep 解析 JSON。

速查卡片

jq . 格式化 jq -r '.name' 取字段(无引号,给 shell) jq '.items[]' 展开数组 jq '.items[] | select(.ok)' 筛数组元素 jq 'select(.age > 20)' 筛根对象(单条 JSON) jq '{a: .name, b: .city}' 构造对象 jq '.items | map(.name)' 批量变换 jq -c '...' 一行一条(JSON Lines) jq -e '...' 失败时 exit 1(脚本判断)

目录

  • 1. 安装与调用
  • 2. 示例数据
  • 3. 基础用法:取值与遍历
  • 4. 过滤 select
  • 5. 构造与变换
  • 6. 常用内置函数
  • 7. 常用选项
  • 8. 实战场景
  • 9. jq、grep 与 yq
  • 10. 常见坑
  • 11. 何时不必用 jq
  • 12. 延伸阅读

1. 安装与调用

平台安装
Linuxapt install jq/dnf install jq
macOSbrew install jq
Windowswinget install jqlang.jq或 WSL
jq[选项]'<jq表达式>'文件.jsoncat文件.json|jq'<jq表达式>'curl-sURL|jq'<jq表达式>'

JSON 输入
文件 / 管道 / curl

jq 过滤器

格式化 / 字段 / 新 JSON


2. 示例数据

下文示例统一使用data.json

{"name":"Alice","age":25,"skills":["jq","bash","python"],"address":{"city":"Beijing","zip":"100000"}}

数组场景补充users.json

{"items":[{"name":"Alice","age":25,"status":"ok"},{"name":"Bob","age":17,"status":"ok"},{"name":"Carol","age":30,"status":"fail"}]}

3. 基础用法:取值与遍历

3.1 格式化与类型

命令作用
jq . data.json美化缩进(最常用)
jq -C . data.json彩色输出(TTY 下)
jq type data.json根节点类型 →"object"

3.2 对象字段与数组下标

jq'.name'data.json# "Alice"jq'.address.city'data.json# "Beijing"jq-r'.name'data.json# Alice (-r 去掉 JSON 引号,适合 shell 变量)jq'.skills[0]'data.json# "jq"jq'.skills[-1]'data.json# "python"jq'.skills | length'data.json# 3

字段可能不存在时用//默认值:

jq'.phone // "N/A"'data.json# "N/A"

3.3 展开数组与管道

jq'.skills[]'data.json
"jq" "bash" "python"

对象键值:

jq'keys'data.json# ["address", "age", "name", "skills"]jq'to_entries[] | .key'data.json# "name" "age" "skills" "address" (多行输出)

管道|:左侧输出作为右侧输入。

jq'.skills | map(ascii_upcase)'data.json# ["JQ", "BASH", "PYTHON"]

4. 过滤 select

区分两种写法:对数组元素过滤前要先[]展开select作用在单个元素上;对根对象(整条 JSON 就是一个 object)可直接select(条件),保留或丢弃整份输入。

4.1 数组元素过滤

jq'.skills[] | select(. == "bash")'data.json# "bash"jq'.items[] | select(.status == "ok")'users.json

第二条输出两行对象(Alice、Bob)。若写成jq '.items | select(.status == "ok")'错误——此时.是整个数组,不是元素。

4.2 根对象过滤(单对象 JSON)

jq'select(.age > 20)'data.json

年龄 ≤ 20 时 jq 无输出(该条被丢弃)。

4.3 多条件

jq'select(.age > 20 and .name == "Alice")'data.json jq'.items[] | select(.age >= 18 and .status == "ok")'users.json# 仅 Alice

5. 构造与变换

5.1 生成新对象

jq'{user: .name, location: .address.city}'data.json
{"user":"Alice","location":"Beijing"}

5.2 修改字段(不可变风格)

jq'.age += 1'data.json jq'.skills += ["go"]'data.json jq'del(.address.zip)'data.json

输出为新 JSON,原文件不变;写回需重定向:jq ... data.json > data.new.json,或jq ... file | sponge file(moreutils)。

5.3 map 批量变换

jq'.items | map({name, adult: (.age >= 18)})'users.json
[{"name":"Alice","adult":true},{"name":"Bob","adult":false},{"name":"Carol","adult":true}]

6. 常用内置函数

函数说明示例
length字符串/数组长度.skills | length3
keys对象键数组keys
has("key")是否含键has("name")true
map(f)数组映射map(.name)
join(sep)数组拼字符串.skills | join(", ")
sort/sort_by(.field)排序.items | sort_by(.age)
unique去重unique
group_by(.field)分组.items | group_by(.status)
jq'.skills | join(", ")'data.json# "jq, bash, python"jq'.items | group_by(.status)'users.json# [{"status":"fail",...}, {"status":"ok",...}] 两组

7. 常用选项

选项作用
-rraw 输出,字符串无引号
-ccompact,一行一条 JSON(流式处理友好)
-sslurp,多行/多个 JSON 文档读入为数组
-C彩色
-e过滤器结果为 false/null 时 exit 1(脚本判断)
--arg k v传入外部变量$k
--argjson k v传入 JSON 变量
--stream流式解析超大 JSON(进阶,见下)
# slurp:多个 JSON 文件合并为一个数组jq-s'.'a.json b.json# 外部变量jq--argprefix"user"'{id: ($prefix + "_" + .name)}'data.json# {"id": "user_Alice"}

--stream(进阶)

日常 API /kubectl响应无需--stream。仅当单文件数百 MB、无法一次jq .载入时考虑:

# 流式输出 [路径, 值] 对;路径末级为叶子时 length==2jq--stream'select(length == 2)'huge.json|head

语义较难,详见 jq 手册 --stream;多数场景用jq -c处理 JSON Lines 即可。


8. 实战场景

8.1 API 提取字段

curl-shttps://api.github.com/users/octocat\|jq'{login, id, public_repos}'

8.2 Kubernetes

kubectl get pods-ojson\|jq'.items[] | select(.status.phase != "Running") | .metadata.name'kubectl get pod my-pod-ojson\|jq-r'.spec.containers[].image'

YAML 清单常用兄弟工具yq(见 §9)。

8.3 统计与聚合

jq'.items | length'users.json# 3jq'[.items[].age] | add / length'users.json# 24(平均年龄)jq'[.items[] | select(.status=="fail")] | length'users.json# 1

8.4 CI / 日志一行 JSON

grep'^{'app.log|jq-c'select(.level == "ERROR") | {ts, msg}'

CI 脚本建议开头:

set-euopipefail# ...if!jq-e'.build.passed == true'report.json>/dev/null;thenecho"build failed">&2;exit1fi

避免jq解析失败或-e判假时被管道静默吞掉。

8.5 与 shell 变量

name=$(jq-r'.name'data.json)ifjq-e'.age >= 18'data.json>/dev/null;thenecho"adult";fi

9. jq、grep 与 yq

场景工具
结构化 JSON 取字段、改结构jq
YAML(K8s manifest、docker-compose)yq(语法与 jq 高度相似,如yq '.spec.replicas' deploy.yaml
纯文本日志、非 JSON 行grep/rg
JSON 里搜子串(应急)jq -r '.. | strings' | grep foo(笨重)
错误:curl ... | grep '"name"' # 易匹配错字段、无法处理嵌套 正确:curl ... | jq -r '.name'

JSON Lines(每行一个 JSON)常用jq -c或逐行管道。


10. 常见坑

正确做法
jq .name无引号shell 拆词 →jq '.name'
输出带引号无法赋变量字符串用-r
对数组select忘写[].items[] | select(...)
修改原文件jq 只 stdout →重定向sponge
null字段//默认值或select(has("x"))
数字与字符串比较.id == "123"vs.id == 123类型要一致
CI 中 jq 失败被忽略set -euo pipefail+-e

11. 何时不必用 jq

场景更合适的工具
GB 级 JSON ETL、复杂多步关联Python / Go / DuckDB;jq 全量读入慢
复杂业务逻辑、多文件事务应用代码,而非 shell 一行链
原地改文件jq 不直接写盘;需重定向或sponge,易误覆盖
非 JSON(纯文本、CSV 主场景)awk/csvkit/ 专用解析器
YAML 为主yqkubectl内置-o json再 jq

jq 的定位是:命令行上的 JSON 瑞士军刀——快、声明式、管道友好;不是通用数据处理平台。


12. 延伸阅读

资源说明
jq 官网手册与教程
jq 手册 jq(1)内置函数全集
jq play浏览器试过滤器
yqYAML 处理,jq 语法子集

复杂过滤器可先在 jq play 验证,再写入脚本;生产脚本对-eexit code做好判断,避免静默失败。


收束:jq 把 JSON 当成有类型的数据结构来切,而不是文本行;记住引号包表达式-r给 shell数组先[]再 selectmap 做重组,足以覆盖日常 API 与运维九成场景。

验证环境:jq 1.7 · yq 4.x · bash · Linux / macOS / WSL

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 15:44:33

【纯CSS】ul li前缀点(圆点、正方形点等)变色与悬停交互的进阶技巧

1. 列表前缀点基础样式控制列表前缀点&#xff08;bullet points&#xff09;是网页设计中常见的视觉元素&#xff0c;但很多人不知道如何精细控制它们的样式。传统方法是通过list-style-type属性设置基础样式&#xff1a;ul {list-style-type: square; /* 实心方块 *//* 其他可…

作者头像 李华
网站建设 2026/7/14 15:42:05

YimMenu:GTA5终极增强菜单完整使用指南

YimMenu&#xff1a;GTA5终极增强菜单完整使用指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu YimMe…

作者头像 李华
网站建设 2026/7/14 15:41:51

N1盒子救砖刷机全指南:S905D USB Burning Mode底层修复

1. 项目概述&#xff1a;为什么N1刷安卓需要“救砖”式操作&#xff0c;而不是普通升级&#xff1f;我第一次接触N1盒子是在2018年&#xff0c;当时它还是极客圈里小众但口碑炸裂的“神机”——一颗S905D芯片、1GB内存、8GB eMMC&#xff0c;却能硬生生跑通Kodi、Home Assistan…

作者头像 李华
网站建设 2026/7/14 15:39:35

终极免费赛博朋克2077存档编辑器:5步完全掌控夜之城游戏数据

终极免费赛博朋克2077存档编辑器&#xff1a;5步完全掌控夜之城游戏数据 【免费下载链接】CyberpunkSaveEditor A tool to edit Cyberpunk 2077 sav.dat files 项目地址: https://gitcode.com/gh_mirrors/cy/CyberpunkSaveEditor 想要在《赛博朋克2077》中打造属于自己的…

作者头像 李华