yq命令参考大全:最完整的操作语法手册

yq命令参考大全:最完整的操作语法手册

【免费下载链接】yq yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor 【免费下载链接】yq 项目地址: https://gitcode.com/GitHub_Trending/yq/yq

引言:告别YAML处理痛点

你是否还在为复杂YAML文件的解析和修改而烦恼?作为DevOps工程师、开发者或数据分析师,处理YAML/JSON/XML等数据格式时,你可能经常需要:

  • 从多层嵌套结构中快速提取关键信息
  • 批量修改配置文件中的特定字段
  • 合并多个配置文件并解决冲突
  • 对数组和对象进行复杂过滤和转换

yq(YAML Query)作为一款轻量级命令行工具,正是为解决这些痛点而生。它采用类jq语法,支持YAML、JSON、XML、CSV等多种格式,提供了强大的数据查询、修改和转换能力。本文将系统梳理yq的核心操作语法,通过100+实战示例,帮助你掌握从基础到高级的全部技能。

读完本文后,你将能够:

  • 熟练使用30+核心操作符处理各类数据结构
  • 掌握复杂场景下的表达式组合技巧
  • 高效完成配置文件管理、数据清洗和格式转换任务
  • 理解yq与jq的差异及迁移策略

快速入门:安装与基础语法

安装指南

yq提供多平台二进制文件和包管理器安装方式,国内用户推荐以下方法:

# Linux (AMD64)
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq && chmod +x /usr/local/bin/yq

# macOS (Homebrew)
brew install yq

# Windows (Chocolatey)
choco install yq

验证安装:

yq --version  # 应输出 v4.x.x

核心语法框架

yq遵循"表达式-文件"的基本使用模式,核心语法结构如下:

# 基本语法
yq [选项] '<表达式>' [文件...]

# 常用选项
-i, --inplace   # 原地修改文件
-n, --null-input # 不读取输入,直接执行表达式
-p, --input-format # 指定输入格式(auto/yaml/json/xml/csv)
-o, --output-format # 指定输出格式
-e, --exit-status # 根据结果设置退出状态码
数据选择基础
表达式功能描述示例
.选择根节点yq '.' file.yaml
.key选择键为key的子节点yq '.name' config.yaml
.[index]选择数组指定索引元素yq '.items[0]' list.yaml
.[start:end]数组切片yq '.items[1:3]' list.yaml
..递归遍历所有节点yq '.. | .name' deep.yaml

示例:读取多层嵌套数据

给定sample.yaml

a:
  b:
    - name: "Alice"
      age: 30
    - name: "Bob"
      age: 25
# 提取第二个用户的年龄
yq '.a.b[1].age' sample.yaml  # 输出: 25

# 递归提取所有name字段
yq '.. | .name' sample.yaml   # 输出: Alice \n Bob

核心操作符全解析

1. 数据选择与过滤

select:条件筛选

语法.[] | select(<条件表达式>)

示例:筛选数组元素

# 筛选age>28的用户
yq '.a.b[] | select(.age > 28)' sample.yaml

输出:

name: "Alice"
age: 30

高级用法:多条件组合

# 筛选age>25且name包含"li"的用户
yq '.a.b[] | select(.age > 25 and .name | contains("li"))' sample.yaml
contains:包含判断

语法contains(<值>)

示例:判断数组包含关系

# 检查数组是否包含特定元素
yq '.tags | contains(["prod", "web"])' config.yaml

字符串包含检查

# 检查name字段是否包含"Ali"
yq '.a.b[0].name | contains("Ali")' sample.yaml  # 输出: true

2. 数据修改与更新

= / |=:赋值操作符

语法<路径> = <值><路径> |= <表达式>

示例:基本赋值

# 原地更新文件中的版本号
yq -i '.version = "1.0.1"' config.yaml

示例:基于原 value 更新

# 将所有age增加5
yq '.a.b[].age |= . + 5' sample.yaml
add:元素添加

语法<数组> + <值><数组> += <值>

示例:数组拼接

# 合并两个数组
yq '.a + .b' data.yaml

示例:追加元素

# 向数组追加新元素
yq '.items += "new-item"' list.yaml
del:删除操作

语法del(<路径>)

示例:删除指定节点

# 删除第二个用户
yq 'del(.a.b[1])' sample.yaml

示例:条件删除

# 删除age<28的用户
yq 'del(.a.b[] | select(.age < 28))' sample.yaml

3. 逻辑与比较运算

布尔运算符

支持andornot逻辑运算,以及==!=><等比较运算符。

示例:多条件筛选

# 选择age在25-35之间的用户
yq '.a.b[] | select(.age >= 25 and .age <= 35)' sample.yaml
any / all:数组逻辑判断

语法any(任一元素满足)、all(所有元素满足)

示例:检查数组条件

# 判断是否有用户年龄大于30
yq '.a.b[].age | any(. > 30)' sample.yaml

4. 数据转换与计算

keys:获取键列表

语法keys

示例:获取对象所有键

# 获取用户对象的所有属性名
yq '.a.b[0] | keys' sample.yaml

输出:

- name
- age
length:长度计算

语法length

示例:计算数组长度

# 获取用户数量
yq '.a.b | length' sample.yaml  # 输出: 2
sort / sort_by:排序

语法sort(基本排序)、sort_by(<表达式>)(按指定条件排序)

示例:按年龄排序用户

# 按age升序排列
yq '.a.b | sort_by(.age)' sample.yaml

示例:降序排列

# 按age降序排列
yq '.a.b | sort_by(.age) | reverse' sample.yaml

高级应用场景

1. 文件合并与处理

多文件合并
# 合并两个YAML文件(后者覆盖前者)
yq eval-all 'select(fileIndex==0) * select(fileIndex==1)' base.yaml override.yaml
批量处理多个文件
# 为所有YAML文件添加环境标记
yq -i '.env = "prod"' configs/*.yaml

2. 格式转换

JSON与YAML互转
# JSON转YAML
yq -Poy input.json > output.yaml

# YAML转JSON
yq -oj input.yaml > output.json
CSV转换
# CSV转YAML数组
yq --input-format csv '.' data.csv

3. 复杂数据处理流程

示例:数据提取与转换流水线

# 从JSON日志中提取错误信息并格式化
cat app.log | yq -p json '.[] | select(.level == "error") | {time: .timestamp, msg: .message}'

流程图:yq数据处理流水线

mermaid

实战技巧与最佳实践

常用命令速查表

任务命令示例
读取特定字段yq '.key.subkey' file.yaml
条件更新yq '.key[] |= select(condition).field = value' file.yaml
文件合并yq eval-all '. as $item ireduce({}; . * $item)' *.yaml
环境变量注入NAME=mike yq '.name = strenv(NAME)' file.yaml
注释保留yq -i '.key = "value"' file.yaml(自动保留注释)

性能优化建议

  1. 避免深层递归..操作符可能导致性能问题,尽量使用明确路径
  2. 流式处理大文件:使用eval-all替代多次调用
  3. 批量操作:利用通配符一次性处理多个文件

常见问题解决

Q: 如何处理包含特殊字符的键名?

A: 使用引号包裹键名:yq '."my-key.with.dots"' file.yaml

Q: 如何保留原文件格式和注释?

A: 使用-i选项原地修改,yq会自动保留注释和样式

总结与展望

yq作为一款功能强大的命令行数据处理工具,凭借其类jq语法和多格式支持,已成为YAML/JSON处理的得力助手。本文系统介绍了其核心操作符、高级应用和实战技巧,涵盖了从基础查询到复杂转换的全场景需求。

随着数据处理需求的不断增长,yq也在持续进化。未来版本可能会增强对复杂数据结构的支持,并优化大型文件处理性能。掌握yq不仅能显著提升配置管理效率,更能为DevOps自动化、数据清洗等场景提供强大助力。

立即行动:使用yq --help探索更多选项,或访问官方文档获取最新教程。如有疑问,欢迎在项目GitHub仓库提交issue或参与讨论。

本文基于yq v4.x版本编写,部分功能可能随版本更新有所变化,请以官方文档为准。

【免费下载链接】yq yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor 【免费下载链接】yq 项目地址: https://gitcode.com/GitHub_Trending/yq/yq

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值