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