yq:基於 Go 實現處理 YAML、JSON、XML、CSV、TOML 的命令行工具
在現代開發和運維的世界中,處理和轉換不同格式的數據文件如 YAML、JSON、XML、CSV 等是日常任務。文件格式的多樣性和複雜性常常給開發者帶來不小的挑戰。在這種情況下,強大的命令行工具能夠極大地簡化工作流程。本文將深入探討一個強大的多功能工具——go yq,它能夠便捷地處理 YAML、JSON、XML、CSV、TOML 以及屬性文件。
安裝 go yq
首先,我們需要安裝 go yq。以下是安裝步驟:
安裝 Go 編譯器
go yq 是用 Go 語言編寫的,因此你需要先安裝 Go 編譯器。可以通過以下步驟進行安裝:
# 更新包列表
sudo apt update
# 安裝 Go
sudo apt install golang-go
安裝 go yq
接下來,使用 Go 工具鏈下載並安裝 go yq:
go install github.com/mikefarah/yq/v4@latest
安裝完成後,可以通過以下命令驗證:
yq --version
你應該會看到類似以下的輸出:
yq (https://github.com/mikefarah/yq/) version x.x.x
基本用法
go yq 可以處理多種文件格式,以下是一些常見的用法示例:
讀取 YAML 文件
假設有一個名爲 example.yaml 的 YAML 文件,內容如下:
name: John Doe
age: 30
address:
city: ExampleCity
zip: 12345
可以使用 yq 讀取這個文件的內容:
yq e . example.yaml
輸出將是:
name: John Doe
age: 30
address:
city: ExampleCity
zip: 12345
讀取 JSON 文件
假設有一個名爲 example.json 的 JSON 文件,內容如下:
{
"name": "John Doe",
"age": 30,
"address": {
"city": "ExampleCity",
"zip": 12345
}
}
可以使用 yq 讀取這個文件的內容:
yq e -o=json . example.json
輸出將是:
{
"name": "John Doe",
"age": 30,
"address": {
"city": "ExampleCity",
"zip": 12345
}
}
轉換格式
go yq 強大的一點在於它可以在多種格式之間轉換。比如,你可以將 YAML 文件轉換爲 JSON 文件:
yq e -o=json . example.yaml
類似地,可以將 JSON 文件轉換爲 YAML 文件:
yq e -o=yaml . example.json
編輯文件
可以使用 yq 編輯文件內容。以下演示如何修改 example.yaml 文件中的值:
yq e '.age = 31' -i example.yaml
修改後的 example.yaml 文件內容將是:
name: John Doe
age: 31
address:
city: ExampleCity
zip: 12345
查詢數據
有時我們只需要獲取文件中的某一部分數據,yq 提供了一種簡單的查詢方式。比如,可以查詢 example.yaml 文件中的 address 字段:
yq e '.address' example.yaml
輸出將是:
city: ExampleCity
zip: 12345
多文件處理
yq 還支持同時處理多個文件,比如合併兩個 YAML 文件:
假設有兩個文件 file1.yaml 和 file2.yaml,內容如下:
file1.yaml:
name: John Doe
age: 30
file2.yaml:
address:
city: ExampleCity
zip: 12345
可以使用以下命令將這兩個文件合併:
yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1)' file1.yaml file2.yaml
輸出將是:
name: John Doe
age: 30
address:
city: ExampleCity
zip: 12345
使用嵌套命令
有時我們需要進行一些更復雜的操作,比如修改嵌套的值。假設我們需要修改 example.yaml 文件中 address.city 的值,可以使用嵌套命令:
yq e '.address.city = "NewCity"' -i example.yaml
修改後的文件內容將是:
name: John Doe
age: 30
address:
city: NewCity
zip: 12345
使用管道傳輸與其他命令組合
go yq 還可以與其他命令組合使用,充分利用管道傳輸數據。比如,可以結合 jq 命令處理 JSON 文件:
cat example.json | yq e -o=json '.' | jq '.name'
輸出將是:
"John Doe"
進階用法和擴展
自定義函數
go yq 支持自定義函數,我們可以在處理文件時執行自定義邏輯。以下是一個簡單的例子,創建一個自定義函數將所有字符串轉換爲大寫:
yq e 'def uppercase: map_values(if type == "!!str" then (. | upcase) else . end); . ' example.yaml
使用正則表達式
go yq 支持使用正則表達式進行復雜的過濾和替換操作。假設我們需要替換所有以 J 開頭的名字,可以使用以下命令:
yq e '(.name | select(. == "John Doe") | sub("John", "Jane"))' example.yaml
結合自動化工具
將 go yq 結合到自動化工具如 Makefile 或 CI/CD 管道中,可以極大地提升自動化程度和效率。例如,可以在 Makefile 中定義一個任務處理 YAML 文件:
process_yaml:
yq e '.version += 1' -i example.yaml
在 CI/CD 管道中,可以使用如下步驟:
jobs:
process_yaml:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Install yq
run: go install github.com/mikefarah/yq/v4@latest
- name: Process YAML
run: yq e '.version += 1' -i example.yaml
總結
go yq 是一個強大而靈活的命令行工具,適用於處理多種文件格式如 YAML、JSON、XML、CSV、TOML 和屬性文件。通過本文的詳細講解和豐富的示例,希望你已經掌握了 go yq 的基本用法和進階技巧,並能在實際工作中靈活運用這個工具,提高工作效率。如果你對數據文件處理有更高的需求,可以進一步探索 go yq 的文檔和社區資源,挖掘更多高級特性。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/_YsuLRBIetOO22N_t5Bbow