从 grep 获取特定输出

Get specific output from grep

我正在尝试使用 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 命令。 感谢您的帮助

使用 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 删除从第一个剩余的 " 到行尾的所有内容并打印结果。