Получите конкретный вывод от 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. Спасибо за помощь

1 ответ

Решение

Использование grep

Нам нужно внести всего одно небольшое изменение в grep -Pкоманда. Ваша команда была:

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

Нам просто нужно заменить .* (что соответствует всему до конца строки) с [^"]* with соответствует всему, но не включая первое ":

$ 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 удаляет все из первых оставшихся " до конца строки и распечатывает результат.

Другие вопросы по тегам