解析 yaml 文件| 根据 key 获取 yaml 文件中的 value | 将 yaml 文件一键转换成 csv 文件

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
  1. .a.b[0].c = "cool": 这部分修改了 YAML 结构中的 a.b[0].c 字段的值为 "cool"。这意味着它会在 YAML 文件中查找 a 对象下的 b 数组中的第一个元素,然后在该元素的 c 字段中设置值为 "cool"。

  2. .x.y.z = "foobar": 这部分修改了 YAML 结构中的 x.y.z 字段的值为 "foobar"。与第一个修改类似,它会查找 x 对象下的 y 对象,然后在 y 对象下的 z 字段中设置值为 "foobar"。

  3. .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"'
  1. .[]: 这部分表示选择 YAML 结构中的所有元素。假设你有一个 YAML 列表,这会选择列表中的每个元素。

  2. select(.name == "foo"): 这一部分是一个条件选择器,用于筛选具有特定属性 name 值为 "foo" 的元素。

  3. |: 这是管道操作符,用于将前一个表达式的结果传递给下一个表达式。

  4. .address: 这是选择了筛选后元素的 .address 属性。

  5. = "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.com
      - user: Camera2
        profile: /ftp_backend/Camera/Camera2
        retetion_days: 90
        archive_days: 30
        cleanup_disabled: yes
        archive_disabled: yes
        owner: Camera@onmicrosoft.com
      - user: Camera3
        profile: /ftp_backend/Camera/Camera3
        retetion_days: 360
        archive_days: 30
        cleanup_disabled: yes
        archive_disabled: yes
        owner: Camera@onmicrosoft.com

使用一个命令直接将 .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 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用以下步骤将 CSV 文件转换为 YAML 文件: 1. 读取 CSV 文件解析数据。 2. 将 CSV 数据转换为 YAML 格式。 3. 将 YAML 数据写入新的文件。 以下是一个 Java 代码示例,可以将 CSV 文件转换为 YAML 文件: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.yaml.snakeyaml.Yaml; public class CsvToYamlConverter { public static void main(String[] args) { String csvFile = "input.csv"; String yamlFile = "output.yaml"; List<Map<String, Object>> data = readCsv(csvFile); writeYaml(yamlFile, data); } public static List<Map<String, Object>> readCsv(String csvFile) { List<Map<String, Object>> data = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) { String line; String[] headers = br.readLine().split(","); while ((line = br.readLine()) != null) { String[] values = line.split(","); Map<String, Object> record = new LinkedHashMap<>(); for (int i = 0; i < headers.length; i++) { record.put(headers[i], values[i]); } data.add(record); } } catch (Exception e) { e.printStackTrace(); } return data; } public static void writeYaml(String yamlFile, List<Map<String, Object>> data) { try (FileWriter writer = new FileWriter(yamlFile)) { Yaml yaml = new Yaml(); yaml.dump(data, writer); } catch (Exception e) { e.printStackTrace(); } } } ``` 在此示例,我们使用 `readCsv` 函数将 CSV 文件读取并解析为一个包含 `Map` 对象的列表。然后,我们使用 `writeYaml` 函数将数据写入 YAML 文件。 请注意,此示例使用 SnakeYAML 库来执行 YAML 的读写操作。在运行此代码之前,需要将 SnakeYAML 库添加到项目的依赖项

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值