需要有关 bask awk 的帮助,通过查找文件中的模式来更新 Yaml 文件

2023-12-27

上下文:我对 UNIX 脚本非常陌生,并且bash.

我有一个.bash脚本需要一个.yaml以及作为参数传递的虚拟机数组。

(e.g.)

myscript.sh my.yaml neo1 neo2 neo3 alice1 alice2 alice3

如何找到监视器虚拟机密钥模式并将该监视器部分的最后一行归档并添加到该部分的最后一行?

已经有一个示例函数,它可以识别某种模式以给出该插入行的行号......但它需要一些更改。请指教 例子

getline() {
  awk '
    BEGIN { monitor_vms="'${}'"; ln=1; fnd=0; }
      (fnd==1 && $0 ~ /^  [a-z]/) { exit }
      ($0~/^monitor_vms:/) { fnd = 1 }
      ($0 ~ /./ && $0 !~ /^#/) { ln = NR }
    END { print ln }' ${1}
}


for name in $VM_LIST; do
  line=`getline my.yaml monitor_vms`
  sed -i -e ${line}"a\- name: \"${vmname}\"\n my.yaml
done

文件my.yaml看起来像下面这样:

---
- someotherkey: hello
  value: some_value
- someotherkey1: hello1
  value1: some_value1
- monitor_vms:
  - name:  sujana
    cnt: 5
  - name: vijaya
    cnt: 5
- static_configs:
  - location:
    datacenter: 

我希望能生产出所需的my.yaml,更新后:

---
- someotherkey: hello
  value: some_value
- someotherkey1: hello1
  value1: some_value1
- monitor_vms:
  - name:  sujana
    cnt: 5
  - name: vijaya
    cnt: 5
  - name: neo1
  - name: neo2
  - name: neo3
  - name: alice1
  - name: alice2
  - name: alice3
- static_configs:
  - location:
    datacenter: 

当您使用 awk 时,您永远不需要 sed,您可以让 shell 变量扩展为脚本的一部分,并且您的代码中还有其他 shell 错误。作为起点,您应该将所有脚本复制/粘贴到http://shellcheck.net http://shellcheck.net并修复它告诉您的错误。

这使用 GNU awk 进行“就地”编辑,因为您使用 GNU sed 来执行相同的操作:

$ cat myscript.sh
#!/usr/bin/env bash

file="$1"
shift
awk -i inplace -v vms="$*" '
/^-/ {
    if ( $2 == "monitor_vms:" ) {
        inBlock = 1
    }
    else {
        prtVms()
    }
}
$1 == "-" {
    prev = $0
}
{ print }
END { prtVms() }

function prtVms(    vmsArr, i, n) {
    if ( inBlock ) {
        sub(/:.*/,":",prev)
        n = split(vms,vmsArr)
        for (i=1; i<=n; i++) {
            print prev, vmsArr[i]
        }
    }
    inBlock = 0
}
' "$file"
$ cat my.yaml
---
- someotherkey: hello
  value: some_value
- someotherkey1: hello1
  value1: some_value1
- monitor_vms:
    - name:  sujana
      cnt: 5
    - name: vijaya
      cnt: 5
- static_configs:
   -  location:
      datacenter:
$ ./myscript.sh my.yaml neo1 neo2 neo3 alice1 alice2 alice3
$ cat my.yaml
---
- someotherkey: hello
  value: some_value
- someotherkey1: hello1
  value1: some_value1
- monitor_vms:
    - name:  sujana
      cnt: 5
    - name: vijaya
      cnt: 5
    - name: neo1
    - name: neo2
    - name: neo3
    - name: alice1
    - name: alice2
    - name: alice3
- static_configs:
   -  location:
      datacenter:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要有关 bask awk 的帮助,通过查找文件中的模式来更新 Yaml 文件 的相关文章

随机推荐