【问题标题】:Get specific output from grep [duplicate]从 grep 获取特定输出 [重复]
【发布时间】:2020-01-21 20:19:21
【问题描述】:

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

【问题讨论】:

标签: linux bash grep cri-o


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

【讨论】:

    猜你喜欢
    • 2016-12-10
    • 2015-06-16
    • 2021-06-02
    • 1970-01-01
    • 2021-06-13
    • 2019-02-18
    • 2015-09-16
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多