yq with openSUSE Leap 15.2 使用小記
openSUSE Leap 15.4
yq 4.18
最近在練習 GKE 的時候接觸到 yq 這個軟體
現在的設定檔愈來愈多 YAML 格式的檔案, 之前會用 jq 來處理 YAML 檔的內容
今天來試試看 yq :)
yq 於 Github 介紹如下
a lightweight and portable command-line YAML, JSON and XML processor. yq uses jq like syntax but works with yaml files as well as json, xml, properties, csv and tsv. It doesn't yet support everything jq does - but it does support the most common operations and functions, and more is being added continuously.
Github https://github.com/mikefarah/yq
文件 https://mikefarah.gitbook.io/yq/
首先透過 zypper 來安裝 yq
# zypper install yq
Loading repository data...
Reading installed packages...
Resolving package dependencies...
The following 2 NEW packages are going to be installed:
yq yq-bash-completion
2 new packages to install.
Overall download size: 2.3 MiB. Already cached: 0 B. After the operation,
additional 8.2 MiB will be used.
Continue? [y/n/v/...? shows all options] (y): Y
確認安裝的版本, 目前裝的是 4.18.1 的版本
網路上有些教學文件, 可能是 3.x 的版本, 所以用法可能會不一樣
# rpm -q yq
yq-4.18.1-bp154.1.17.x86_64
測試的 yaml 內容如下
> cat test.yml
apples:
collection:
- name: Green
- name: Blue
favourite: Pink Lady
可以用 yq 來接 STDIN
> cat test.yml | yq
apples:
collection:
- name: Green
- name: Blue
favourite: Pink Lady
也可以直接用 yq
> yq test.yml
apples:
collection:
- name: Green
- name: Blue
favourite: Pink Lady
我目前其實用的相對簡單
讀取某個特定的 value
> yq '.apples.collection' test.yml
- name: Green
- name: Blue
> yq '.apples.favourite' test.yml
Pink Lady
實務上使用的時候是要在 yaml 裏面找出一個欄位然後更新裡面的 value
假設我們要把 favourite 的 value 換成 sakana
現看看置換的結果
> yq '.apples.favourite = "sakana" ' test.yml
apples:
collection:
- name: Green
- name: Blue
favourite: sakana
這個時候還沒有實際置換掉 favourtie 的 value
> cat test.yml
apples:
collection:
- name: Green
- name: Blue
favourite: Pink Lady
使用 -i ( --inplace ) 實際置換
-i, --inplace update the file inplace of first file given.
> yq -i '.apples.favourite = "sakana" ' test.yml
要替代的 value 用雙引號 " " 括起來
> cat test.yml
apples:
collection:
- name: Green
- name: Blue
favourite: sakana
也可以使用變數的方式來處理
> NAME=max yq -i '.apples.favourite = strenv(NAME) ' test.yml
確認檔案內容
> cat test.yml
apples:
collection:
- name: Green
- name: Blue
favourite: max
這邊要注意的是, 因為是使用 strenv(NAME) 如果你的變數沒有跟 yq 在同一行, 可能會取不到正確的值, 如果是之前就宣告的, 要確認 > env | grep NAME 有看到, 或是透過 > export NAME 來處理
另外一種方式
> NAME=ines
> echo $NAME
ines
> yq -i '.apples.favourite = " '$NAME' " ' test.yml
這邊要注意的是要替代的 value 用雙引號 " " 括起來, 然後變數使用單引號 ' ' 括起來
> cat test.yml
apples:
collection:
- name: Green
- name: Blue
favourite: ines
取代多欄位
> yq -i '.apples.favourite = "max" | .apples.collection[0].name = "red" ' test.yml
使用 Pipe 符號分隔, 這邊多指定 collection 的第1個, name 的key 內容為 red
> cat test.yml
apples:
collection:
- name: red
- name: Blue
favourite: max
最後來嘗試轉檔功能
> yq -o json test.yml
{
"apples": {
"collection": [
{
"name": "red"
},
{
"name": "Blue"
}
],
"favourite": "max"
}
}
其中我真的很喜歡 props 的輸出, 可以很清楚的列出架構
> yq -o props test.yml
apples.collection.0.name = red
apples.collection.1.name = Blue
apples.favourite = max
又多學了些東西
~ enjoy it
References
沒有留言:
張貼留言