linux - 从 grep 获取特定输出

标签 linux bash grep cri-o

<分区>

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

关于linux - 从 grep 获取特定输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58034030/

相关文章:

python - 导入一个位置未知的 python 模块

linux - 将 1.txt、2.txt ... 10.txt 连接成一个文件

bash - Cmder - 'eval' 命令无法识别

linux - 从文本文件中选择 md5sums 并在 Linux 中删除重复项

linux - BASH grep 脚本

linux - arm linux 系统调用中 vector_swi() 中使用的堆栈指针是如何初始化的?

c - 如何使用原始套接字 ping 本地主机?

linux - Bash oneliner with pipes 和 if condition giving error

linux - 脚本搜索多个字符串

linux - 如何排除与 "grep -R"中的 glob 模式匹配的多个目录?