1

我正在尝试使用 grep 获得特定的输出,但我无法这样做。这是我的 grep 命令:

crictl inspect 47aaecb541688accf37840108cc0d19b39b84f8337740edf2ca7e5e81a24328e | grep "io.kubernetes.pod.namespace"

上述命令的输出是"io.kubernetes.pod.namespace": "kube-system",

我什至尝试过 crictl inspect 47aaecb541688accf37840108cc0d19b39b84f8337740edf2ca7e5e81a24328e | grep -Po '(?<="io.kubernetes.pod.namespace": ").*',但我得到的输出是kube-system",

我只想要价值,即kube-system

如何修改我的 grep 命令。谢谢您的帮助

4

1 回答 1

1

使用 grep

我们只需要对grep -P命令做一点小改动。你的命令是:

$ echo '"io.kubernetes.pod.namespace": "kube-system",' | grep  -Po '(?<="io.kubernetes.pod.namespace": ").*'
kube-system",

我们只需要将.*(匹配到行尾的所有内容)替换[^"]*为匹配所有内容,但不包括第一个"

$ echo '"io.kubernetes.pod.namespace": "kube-system",' | grep  -Po '(?<="io.kubernetes.pod.namespace": ")[^"]*'
kube-system

或者,使用您的crictl命令:

crictl inspect 47aaecb541688accf37840108cc0d19b39b84f8337740edf2ca7e5e81a24328e | grep  -Po '(?<="io.kubernetes.pod.namespace": ")[^"]*'

使用 sed

$ echo '"io.kubernetes.pod.namespace": "kube-system",' | sed -n '/"io.kubernetes.pod.namespace"/{s/.*": "//; s/".*//p}'
kube-system

这个怎么运作:

  • -n告诉 sed 不要打印,除非我们明确要求它打印。

  • /"io.kubernetes.pod.namespace"/{...}仅选择那些包含"io.kubernetes.pod.namespace"并在其上执行大括号中的命令的行。

  • s/.*": "//删除从行首到最后一次出现的所有内容": "

  • s/".*//p删除从第一个剩余"到行尾的所有内容并打印结果。

于 2019-09-20T19:37:36.790 回答