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