解析传递给YML的变量

时间:2020-07-07 15:53:14

标签: yaml yq

我有一个类似下面的yml文件

functionbeat.provider.aws.functions:
    - name: cloudwatch
      enabled: true
      type: cloudwatch_logs
      description: "lambda function for cloudwatch logs"
      triggers:
        - log_group_name: "my-application-1"

我希望能够在此处扩展log_group_name键。 这个想法是log_group_name键通过变量作为列表传递,例如

logGroups = my-application-1,my-application-2,my-application-3,my-application-4

我希望这会在yml中翻译成这个

functionbeat.provider.aws.functions:
    - name: cloudwatch
      enabled: true
      type: cloudwatch_logs
      description: "lambda function for cloudwatch logs"
      triggers:
        - log_group_name: "my-application-1"
        - log_group_name: "my-application-2"
        - log_group_name: "my-application-3"
        - log_group_name: "my-application-4"

是否可以使用shellscript或任何解析器/工具来做到这一点?非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

使用bash和awk:

首先将原始Yaml模板放置在名为elastic的文件中:

functionbeat.provider.aws.functions:
   - name: cloudwatch
      enabled: true
      type: cloudwatch_logs
      description: "lambda function for cloudwatch logs"
      triggers:
        - log_group_name: "my-application-1"    

然后使用以下脚本:

#!/bin/bash
awk -v lognam=$1 '/log_group_name:/ { split(lognam,arry,",");for (i in arry) { printf "\t- log_group_name: \"%s\"\n",arry[i] } } !/log_group_name:/ { print $0 }' elastic

我们传入一个变量,例如“我的应用程序1,我的应用程序2”。然后,脚本依次将变量作为变量lognam传递给awk。对于所有与模式不匹配“ log_group_name:”的字符串,只需打印该行,否则,将变量lognam拆分为一个以“,”分隔的名为arry的数组,然后遍历该数组,并打印以制表符和“-”为前缀的数组的内容log_group_name:“