一個輕量級、可移植的命令列 YAML、JSON 和 XML 處理器。 yq
使用類似 jq 的語法,但適用於 yaml 檔案以及 json、xml、properties、csv 和 tsv。它也不支援jq
所做的所有操作 - 但它確實支援最常見的操作和功能,並且正在不斷添加更多功能。
yq 是用 go 編寫的 - 因此您可以為您的平台下載一個無依賴的二進位文件,然後您就可以開始了!如果您願意,可以使用各種套件管理器以及 Docker 和 Podman,下面列出了所有這些。
讀取一個值:
yq '.ab[0].c' 文件.yaml
來自 STDIN 的管道:
yq '.ab[0].c' < 文件.yaml
就地更新 yaml 文件
yq -i '.ab[0].c = "cool"' file.yaml
使用環境變數更新
NAME=mike yq -i '.ab[0].c = strenv(NAME)' file.yaml
合併多個文件
# 合併兩個檔案yq -n 'load("file1.yaml") * load("file2.yaml")'# 使用glob 進行合併:# 注意使用`ea` 一次評估所有檔案# 而不是按順序評估所有文件yq ea'。 as $item ireduce ({}; . * $item )' path/to/*.yml
對 yaml 檔案進行多次更新
yq -i ' .ab[0].c = "酷" | .xyz =“foobar”| .person.name = strenv(NAME)' file.yaml
尋找並更新數組中的項目:
yq '(.[] | select(.name == "foo") | .address) = "12 cat st"'
將 JSON 轉換為 YAML
yq-Poy 樣本.json
請參閱食譜以取得更多範例,並參閱文件以取得更多資訊。
查看常見問題和酷想法的討論
使用 wget 下載 gzip 的預編譯二進位檔:
例如,VERSION=v4.2.0 和 BINARY=yq_linux_amd64
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY}.tar.gz -O - | tar xz && mv ${BINARY} /usr/bin/yq
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY} -O /usr/bin/yq && chmod +x /usr/bin/yq
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq && chmod +x /usr/bin/yq
使用自製軟體
brew install yq
snap install yq
yq
安裝受到嚴格限制,這意味著它無法直接存取根檔案。要讀取根文件,您可以:
sudo cat /etc/myfile | yq '.a.path'
要寫入根文件,您可以使用海綿:
sudo cat /etc/myfile | yq '.a.path = "value"' | sudo sponge /etc/myfile
或寫入暫存檔:
sudo cat /etc/myfile | yq '.a.path = "value"' | sudo tee /etc/myfile.tmp sudo mv /etc/myfile.tmp /etc/myfile rm /etc/myfile.tmp
docker run --rm -v "${PWD}":/workdir mikefarah/yq [指令] [標誌] [表達式]FILE...
請注意,如果您願意,您可以在沒有網路存取權限和其他權限的情況下在 docker 中執行yq
,即--security-opt=no-new-privileges --cap-drop all --network none
。
podman run --rm -v "${PWD}":/workdir mikefarah/yq [指令] [標誌] [表達式]FILE...
您需要將-i--interactive
標誌傳遞給 docker:
docker run -i --rm mikefarah/yq '.this.thing' < myfile.yml
podman run -i --rm mikefarah/yq '.this.thing' < myfile.yml
docker run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq
podman run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq
使用 bash 函數來避免輸入整個 docker 命令會很有用:
yq() { docker run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"}
yq() { podman run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"}
yq
的容器映像檔不再在 root 下運作 (#860)。如果您想在容器映像中安裝更多內容,或在嘗試讀取/寫入檔案時遇到權限問題,您需要:
docker run --user="root" -it --entrypoint sh mikefarah/yq
podman run --user="root" -it --entrypoint sh mikefarah/yq
或者,在您的 Dockerfile 中:
FROM mikefarah/yq USER root RUN apk add --no-cache bash USER yq
預設情況下,yq 使用的高山影像不包含時區資料。如果您想使用tz
運算符,則需要包含以下資料:
FROM mikefarah/yq USER root RUN apk add --no-cache tzdata USER yq
如果您將 podman 與 SELinux 結合使用,則需要在磁碟區掛載上設定共用磁碟區標誌:z
:
-v "${PWD}":/workdir:z
- name: Set foobar to cool uses: mikefarah/yq@master with: cmd: yq -i '.foo.bar = "cool"' 'config.yml' - name: Get an entry with a variable that might contain dots or spaces id: get_username uses: mikefarah/yq@master with: cmd: yq '.all.children.["${{ matrix.ip_address }}"].username' ops/inventories/production.yml - name: Reuse a variable obtained in another step run: echo ${{ steps.get_username.outputs.result }}
有關更多信息,請參閱 https://mikefarah.gitbook.io/yq/usage/github-action。
go install github.com/mikefarah/yq/v4@latest
由於這些受到社群的支持❤️ - 但是,它們可能與官方支援的版本已經過時。
請注意,Debian 軟體包(之前由 @rmescandon 支援)不再維護。請使用替代安裝方法。
在 x-cmd 上查看yq
:https://x-cmd.com/mod/yq
即時結果:即時查看 yq 過濾器的輸出。
錯誤處理:遇到語法錯誤?它將顯示錯誤訊息和最接近的有效過濾器的結果
謝謝@edwinjhlee!
nix profile install nixpkgs#yq-go
看這裡
webi yq
請參閱 @adithyasunil26 支援的 webi (https://github.com/webinstall/webi-installers/tree/master/yq)
pacman -S go-yq
使用巧克力
choco install yq
由@chillum 支持 (https://chocolatey.org/packages/yq)
使用湯匙
scoop install main/yq
使用winget
winget install --id MikeFarah.yq
使用 MacPort
sudo port selfupdate sudo port install yq
由@herbygillot 支援(https://ports.macports.org/maintainer/github/herbygillot)
Alpine Linux v3.20+(和 Edge):
apk add yq-go
Alpine Linux v3.19 版本:
apk add yq
由 Tuan Hoang 支持 (https://pkgs.alpinelinux.org/packages?name=yq-go)
Flox 可用於透過 WSL 在 Linux、MacOS 和 Windows 上安裝 yq。
flox install yq
包含許多範例的詳細文檔
用便攜式 go 編寫,因此您可以下載一個可愛的無依賴二進位文件
使用與jq
類似的語法,但適用於 YAML、JSON 和 XML 文件
完全支援多文檔yaml文件
支援 yaml 前面的內容區塊(例如 jekyll/assemble)
彩色 yaml 輸出
使用 TZ 進行日期/時間操作和格式化
深入資料結構
排序鍵
操作 yaml 註解、樣式、標籤、錨點和別名。
更新到位
選擇和更新複雜的表達式
更新時保留 yaml 格式和註釋(儘管有空格問題)
解碼/編碼 Base64 數據
從其他文件載入內容
與 json/ndjson 相互轉換
與 xml 相互轉換
與屬性之間的轉換
與 csv/tsv 相互轉換
通用 shell 完成腳本 (bash/zsh/fish/powershell)
減少以合併多個文件或對數組求和或其他奇特的東西。
在自動化管道中使用的 Github Action(感謝@devorbitus)
查看文件以了解更詳細和高級的用法。
Usage: yq [flags] yq [command] Examples: # yq defaults to 'eval' command if no command is specified. See "yq eval --help" for more examples. yq '.stuff' < myfile.yml # outputs the data at the "stuff" node from "myfile.yml" yq -i '.stuff = "foo"' myfile.yml # update myfile.yml in place Available Commands: completion Generate the autocompletion script for the specified shell eval (default) Apply the expression to each document in each yaml file in sequence eval-all Loads _all_ yaml documents of _all_ yaml files and runs expression once help Help about any command Flags: -C, --colors force print with colors -e, --exit-status set exit status if there are no matches or null or false is returned -f, --front-matter string (extract|process) first input as yaml front-matter. Extract will pull out the yaml content, process will run the expression against the yaml content, leaving the remaining data intact --header-preprocess Slurp any header comments and separators before processing expression. (default true) -h, --help help for yq -I, --indent int sets indent level for output (default 2) -i, --inplace update the file in place of first file given. -p, --input-format string [yaml|y|xml|x] parse format for input. Note that json is a subset of yaml. (default "yaml") -M, --no-colors force print with no colors -N, --no-doc Don't print document separators (---) -n, --null-input Don't read input, simply evaluate the expression given. Useful for creating docs from scratch. -o, --output-format string [yaml|y|json|j|props|p|xml|x] output format type. (default "yaml") -P, --prettyPrint pretty print, shorthand for '... style = ""' -s, --split-exp string print each result (or doc) into a file named (exp). [exp] argument must return a string. You can use $index in the expression as the result counter. --unwrapScalar unwrap scalar, print the value with no quotes, colors or comments (default true) -v, --verbose verbose mode -V, --version Print version information and quit --xml-attribute-prefix string prefix for xml attributes (default "+") --xml-content-name string name for xml content (if no attribute name is present). (default "+content") Use "yq [command] --help" for more information about a command.
yq
盡量保留註解位置和空格,但它不能處理所有場景(詳細資訊請參閱 https://github.com/go-yaml/yaml/tree/v3)
Powershell有自己的...意見,引用yq
「yes」、「no」在 yaml 1.2 標準中被刪除為布林值 - 這是 yq 假設的標準。
請參閱提示和技巧,以了解更常見的問題和解決方案。