admin管理员组文章数量:1635339
yq
yq 是近期博主发现的解析 yaml 文件的强大命令,git 仓库如下:
GitHub - mikefarah/yq: yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor
它是一个轻量级和可移植的命令行YAML、JSON和XML处理器。yq使用类似jq的语法,可以处理yaml文件以及json、xml、财产、csv和tsv。它还不支持jq所做的一切,但它确实支持最常见的操作和函数,而且还在不断地添加更多。
yq是用go编写的,因此您可以为您的平台下载一个无依赖的二进制文件,这样就可以开始了使用了。
示例:
一般用法 —— 拿到对应字段的值
假设这是我们的 yaml 文件内容:
[root@master ~]# cat a.yaml
sshd_configs:
AllowGroups:
ensure: 'present'
value:
- 'SG-Admin'
- 'Admin'
- 'SC-Admin'
DenyGroups:
value:
- 'DBA'
- 'User'
我想获取组名,使用 yq
yq eval '.*.AllowGroups.value' a.yaml
- 'SG-Admin'
- 'Admin'
- 'SC-Admin'
使用索引
yq eval '.*.AllowGroups.value[0]' a.yaml
- 'SG-Admin'
yq eval '.*.AllowGroups.value[1]' a.yaml
- 'Admin'
yq eval '.*.AllowGroups.value[2]' a.yaml
- 'SC-Admin'
修改 yaml 文件中的值
NAME=mike yq -i '.a.b[0].c = strenv(NAME)' file.yaml
NAME=mike
:这是一个环境变量的设置,将变量NAME
设置为值mike
。yq -i
:这是运行yq
工具的命令。-i
选项表示原地编辑,即在同一文件中进行修改。'.a.b[0].c = strenv(NAME)'
:这是yq
的表达式,用于修改 YAML 文件。它的含义是将strenv(NAME)
的结果(NAME
环境变量的值)插入到 YAML 文件中a.b[0].c
的位置。换句话说,它会将mike
插入到 YAML 结构的a.b[0].c
处。
示例 YAML 文件 file.yaml
可能如下所示:
a:
b:
- c: old_value
修改后:
a:
b:
- c: mike
在一个文件中批量修改多个值
yq -i '
.a.b[0].c = "cool" |
.x.y.z = "foobar" |
.person.name = strenv(NAME)
' file.yaml
-
.a.b[0].c = "cool"
: 这部分修改了 YAML 结构中的a.b[0].c
字段的值为 "cool"。这意味着它会在 YAML 文件中查找a
对象下的b
数组中的第一个元素,然后在该元素的c
字段中设置值为 "cool"。 -
.x.y.z = "foobar"
: 这部分修改了 YAML 结构中的x.y.z
字段的值为 "foobar"。与第一个修改类似,它会查找x
对象下的y
对象,然后在y
对象下的z
字段中设置值为 "foobar"。 -
.person.name = strenv(NAME)
: 这部分使用了strenv(NAME)
,其中NAME
是一个环境变量。它将 YAML 结构中的person.name
字段的值设置为环境变量NAME
的值。
示例 YAML 文件 file.yaml
可能如下所示:
a:
b:
- c: "old_value"
x:
y:
z: "previous_value"
person:
name: "John"
修改后:
a:
b:
- c: "cool"
x:
y:
z: "foobar"
person:
name: "JohnDoe" # 如果 NAME 环境变量的值是 "JohnDoe"
找到 array 中对应的 item 并更新 value
yq '(.[] | select(.name == "foo") | .address) = "12 cat st"'
-
.[]
: 这部分表示选择 YAML 结构中的所有元素。假设你有一个 YAML 列表,这会选择列表中的每个元素。 -
select(.name == "foo")
: 这一部分是一个条件选择器,用于筛选具有特定属性name
值为 "foo" 的元素。 -
|
: 这是管道操作符,用于将前一个表达式的结果传递给下一个表达式。 -
.address
: 这是选择了筛选后元素的.address
属性。 -
= "12 cat st"
: 这部分表示将.address
属性的值设置为 "12 cat st"。
所以,总的来说,这个命令的作用是,找到 YAML 数据中 name
属性等于 "foo" 的所有元素,然后将它们的 address
属性的值设置为 "12 cat st"。
示例 YAML 文件 file.yaml
可能如下所示:
- name: foo
address: 123 street
- name: bar
address: 456 avenue
- name: foo
address: 789 road
修改后:
- name: foo
address: 12 cat st
- name: bar
address: 456 avenue
- name: foo
address: 12 cat st
将 yaml 转换为 csv
如果你的 yaml 中定义了很多重复的变量数据,看起来容易乱,不太直观,可以将 yaml 转换为 csv 文件方便我们观看我们定义的变量:
例:
all:
hosts:
localhost-kafka01:
localhost-kafka02:
vars:
virtual_users:
- user: Camera1
profile: /ftp_backend/Camera/Camera1
archive_days: 30
retetion_days: 120
cleanup_disabled: yes
archive_disabled: yes
owner: Camera@onmicrosoft
- user: Camera2
profile: /ftp_backend/Camera/Camera2
retetion_days: 90
archive_days: 30
cleanup_disabled: yes
archive_disabled: yes
owner: Camera@onmicrosoft
- user: Camera3
profile: /ftp_backend/Camera/Camera3
retetion_days: 360
archive_days: 30
cleanup_disabled: yes
archive_disabled: yes
owner: Camera@onmicrosoft
使用一个命令直接将 .yaml 文件转换为 csv 文件
yq '.all.vars.virtual_users' xxx.yaml -oc > xxx.csv
大致用法就是这样,详细介绍可见:GitHub - mikefarah/yq: yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor
Working with CSV, TSV - yq
版权声明:本文标题:解析 yaml 文件| 根据 key 获取 yaml 文件中的 value | 将 yaml 文件一键转换成 csv 文件 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729204091a1189866.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论