高效文件处理工具 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 常用于:

  1. 配置文件处理,例如在 DevOps 和云原生环境中处理 YAML 等配置文件。
  2. 数据转换,在不同格式(YAML/JSON/XML/CSV)之间进行转换
  3. 数据提取,从复杂数据结构中提取特定字段或值
  4. 批量修改,对多个文件中的特定字段进行统一修改
  5. 自动化脚本,在 shell 脚本中处理结构化数据
  6. 数据验证,检查配置文件是否符合特定结构或值要求

下面是一些使用示例:

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 环境中。它简化了配置文件处理,使得在自动化脚本中操作结构化数据变得轻而易举。