高效文件处理工具 yq
在处理小程序文章索引 JSON 文件时,发现了这个好工具 yq,特分享给大家。
yq 是一个轻量级、命令行驱动的文件处理工具,专门用于处理 YAML、JSON、XML 等结构化数据格式。它类似于著名的 jq(专门处理 JSON 的工具),但扩展了对 YAML 的原生支持,并能够处理多种文件格式之间的转换。
yq 采用 Go 语言编写,具有跨平台特性,可以在 Linux、macOS 和 Windows 系统上运行。它的核心功能包括查询、过滤、修改和转换结构化数据文件。
yq 在大多数 Linux 发行版可以通过包管理器安装:
# Ubuntu/Debian
sudo apt install yq
# CentOS/RHEL
sudo yum install yq
# macOS (使用 Homebrew)
brew install yq
或者从 Github 发布页面下载预编译的二进制文件。
yq 常用于:
- 配置文件处理,例如在 DevOps 和云原生环境中处理 YAML 等配置文件。
- 数据转换,在不同格式(YAML/JSON/XML/CSV)之间进行转换
- 数据提取,从复杂数据结构中提取特定字段或值
- 批量修改,对多个文件中的特定字段进行统一修改
- 自动化脚本,在 shell 脚本中处理结构化数据
- 数据验证,检查配置文件是否符合特定结构或值要求
下面是一些使用示例:
1,查询 YAML 文件
假设我们有一个 config.yaml 文件:
server:
port: 8080
host: "localhost"
database:
name: "test_db"
user: "admin"
我们要获取服务器端口:
yq '.server.port' config.yaml
# 输出: 8080
2,格式转换
将 YAML 转换为 JSON:
yq -o=json config.yaml
输出:
{
"server": {
"port": 8080,
"host": "localhost"
},
"database": {
"name": "test_db",
"user": "admin"
}
}
3,修改文件内容
将端口修改为 9090:
yq -i '.server.port = 9090' config.yaml
4,复杂查询与过滤
我们有一个更复杂的文件 services.yaml:
services:
- name: "web"
replicas: 3
env: "production"
- name: "db"
replicas: 1
env: "production"
- name: "cache"
replicas: 2
env: "staging"
获取所有生产环境的服务名称:
yq '.services[] | select(.env == "production") | .name' services.yaml
# 输出:
# web
# db
5,多文件操作
批量修改多个 YAML 文件中的镜像标签:
for file in *.yaml; do
yq -i '.image.tag = "v1.2.0"' "$file"
done
6,合并 YAML 文件
将两个 YAML 文件合并:
yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1)' file1.yaml file2.yaml > merged.yaml
7,查询 JSON 文件
假设有一个 user.json 文件:
{
"id": 12345,
"name": "Alice",
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "New York",
"zip": "10001"
},
"hobbies": ["reading", "hiking", "photography"]
}
我们可以这样查询:
# 获取用户姓名
yq '.name' user.json
# 输出: Alice
# 获取城市信息
yq '.address.city' user.json
# 输出: New York
# 获取第一个爱好
yq '.hobbies[0]' user.json
# 输出: reading
# 获取所有爱好
yq '.hobbies[]' user.json
# 输出:
# reading
# hiking
# photography
# 查询某个爱好,使用管道过滤
yq '.hobbies[] | select(. == "hiking")' user.json
# 输出: hiking
8,修改 JSON 文件
# 修改电子邮件地址
yq -i '.email = "new_email@example.com"' user.json
# 添加新爱好
yq -i '.hobbies += ["swimming"]' user.json
# 删除字段
yq -i 'del(.address.zip)' user.json
9,JSON 格式转换
JSON 转 YAML
yq -P user.json > user.yaml
# 输出user.yaml
id: 12345
name: Alice
email: alice@example.com
address:
street: 123 Main St
city: New York
hobbies:
- reading
- hiking
- photography
10,处理 JSON 数组
假设有一个 users.json 文件:
[
{
"id": 1,
"name": "Alice",
"active": true
},
{
"id": 2,
"name": "Bob",
"active": false
},
{
"id": 3,
"name": "Charlie",
"active": true
}
]
我们可以这样操作:
# 获取所有活跃用户的名字
yq '.[] | select(.active == true) | .name' users.json
# 输出:
# Alice
# Charlie
# 获取ID 为2的用户
yq '.[] | select(.id == 2)' users.json
# 输出:
# {
# "id": 2,
# "name": "Bob",
# "active": false
# }
11,处理 JSON 文件生成新文件
# 美化压缩的JSON
yq -P compressed.json > pretty.json
# 提取特定字段创建新的JSON
yq '{name: .name, email: .email}' user.json > contact_info.json
# 从JSON数组创建CSV
yq -o=csv '.[] | [.id, .name, .active]' users.json
# 输出:
# 1,Alice,true
# 2,Bob,false
# 3,Charlie,true
yq 还有更多的其它用法,请详细的内容请查看 Github 地址:
https://github.com/mikefarah/yq
yq 是现代开发者和系统管理员工具箱中不可或缺的工具,特别是在云原生和 DevOps 环境中。它简化了配置文件处理,使得在自动化脚本中操作结构化数据变得轻而易举。