Awk 如果存在';没有秩序吗?

Awk 如果存在';没有秩序吗?,awk,Awk,例如,我试图找到一种更好的方法从yaml中删除值-这是我的yaml示例: apiVersion: v1 data: mapRoles: |- - username: user1 rolearn: arn groups: - grp - grp2 - groups: - grp rolearn: arn username: user2 kind: ConfigMap metadata

例如,我试图找到一种更好的方法从yaml中删除值-这是我的yaml示例:

apiVersion: v1
data:
  mapRoles: |-
    - username: user1
      rolearn: arn
      groups:
        - grp
        - grp2
    - groups:
        - grp
      rolearn: arn
      username: user2
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"..."}
  uid: 93ad6dc1-2a1f-11ea-b5da-0ec0e91c7076
我的输入是用户名列表,我可以使用regex进行测试。因为我不能安装任何依赖项,所以我必须使用安装在任何系统中的工具-这就是我选择的awk

在每个部分中,我必须检查用户名是否与任何值列表匹配,如果匹配,则从“组:”列表中删除特定组

我的想法是识别yaml密钥(代表一个用户)的每个开头-然后,将所有内容添加到数组中,同时检查用户名是否与我们期望的完全一致-如果是,打印数组,但不打印相关组,否则-打印整个数组

我已经开始写了,它看起来很复杂-有没有更好的方法

---例子---

如果我将“user1”和“grp”指定为参数,那么yaml应该如下所示:

apiVersion: v1
data:
  mapRoles: |-
    - username: user1
      rolearn: arn
      groups:
        - grp2
    - groups:
        - grp
      rolearn: arn
      username: user2
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"..."}
  uid: 93ad6dc1-2a1f-11ea-b5da-0ec0e91c7076
apiVersion: v1
data:
  mapRoles: |-
    - username: user1
      rolearn: arn
      groups:
        - grp
        - grp2
    - groups:
      rolearn: arn
      username: user2
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"..."}
  uid: 93ad6dc1-2a1f-11ea-b5da-0ec0e91c7076
如果我指定user2和“grp”,它应该如下所示:

apiVersion: v1
data:
  mapRoles: |-
    - username: user1
      rolearn: arn
      groups:
        - grp2
    - groups:
        - grp
      rolearn: arn
      username: user2
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"..."}
  uid: 93ad6dc1-2a1f-11ea-b5da-0ec0e91c7076
apiVersion: v1
data:
  mapRoles: |-
    - username: user1
      rolearn: arn
      groups:
        - grp
        - grp2
    - groups:
      rolearn: arn
      username: user2
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"..."}
  uid: 93ad6dc1-2a1f-11ea-b5da-0ec0e91c7076

这是我的问题-基本上user2是在groups部分之后指定的,因此我不确定删除它的正确方法。

这可能是您试图做的,但您的问题并不清楚:

$ cat tst.awk
BEGIN {
    split(users,tmp)
    for (i in tmp) {
        tgtUsers[tmp[i]]
    }
    split(groups,tmp)
    for (i in tmp) {
        tgtGroups[tmp[i]]
    }
}
match($0,/^[[:space:]]*(-[[:space:]]*)?[^[:space:]]+[[:space:]]*:/) {
    sect = $0
    sub(/^[[:space:]]*(-[[:space:]]*)?/,"",sect)
    sub(/[[:space:]]*:.*/,"",sect)
}
sect == "username" {
    inTgtUsers = ($NF in tgtUsers)
    inGroups = 0
}
sect == "groups" {
    inGroups = 1
}
!(inGroups && inTgtUsers && ($NF in tgtGroups))

因此,根据Ed Morton的说明,我接受了他的脚本,但不得不更改正则表达式,因为它没有捕获名称中带有冒号的组(例如-my:group)


IMHO的专家们总是建议用一种更能理解ymal文件的工具/语言来解析ymal文件,例如-->
yq
,如果你的系统中有这样的工具/语言的话?或者你可以把它安装在你的盒子里?因此,可以根据您的回答给出解决方案。遗憾的是,不,我需要使用最基本的工具,这些工具都是开箱即用安装的,这就是您发布的yaml的真实外观,即用户名和组的前面有时加上
-
,有时不加?如果删除
groups
-groups
下的1个组,
groups
行是否保留,或者在删除最后一个
grp
时是否将其删除?请根据您发布的示例输入以及您迄今为止的尝试,将您的问题显示为预期输出。请参阅。更新了我的问题,是的,基本上我不在乎“-groups:”是否会保留,我只需要删除特定用户的特定组Shi,谢谢,但不完全是这样,如果您仅传递“user1”作为参数,则不应删除第二个组,如果您指定“user2”,则只应删除该用户的grp1。这对我来说有点复杂-因为“username:user2”是在groups部分之后声明的,所以我如何验证此部分是否包含我想要的用户?好的,那么您需要将整个
-username:
-groups:
部分读入缓冲区(数组或字符串),然后分析用户名然后修改并打印缓冲区。这并不难做到,我个人只是懒得去写代码,希望其他人有时间来帮助你。