如何在yaml文件的metadata
部分下获取metadata
标记的值。
apiVersion: v1
kind: Pod
metadata:
name: sss-pod-four
namespace: default
spec:
containers:
- name: sss-test-container
image: anaudiyal/infinite-loop
volumeMounts:
- mountPath: "/mnt/sss"
name: sss-test-volume
volumes:
- name: sss-test-volume
我需要得到sss-pod-four
字符串。
grep "\sname: " config/pod.yaml | awk -F ": " '{print $2}'
上面的代码是打印sss-pod-four
、sss-test-container
和sss-test-volume
。
发布于 2018-03-09 09:17:55
请你试着跟我说一下,如果这对你有帮助的话,请告诉我。
awk '/metadata/{flag=1} flag && /name:/{print $NF;flag=""}' Input_file
现在也添加了一种非单一的线性解决方案,并作了解释:
awk '
/metadata/{ ##checking a string metadata in current line here and if it is TRUE then do following:
flag=1} ##Making a variable named flag value TRUE here.
flag && /name:/{ ##Checking if variable named flag is TRUE here and current line has string name: in it then do following:
print $NF; ##Printing the last column of the current line here.
flag="" ##Making variable named flag value as NULL here.
}
' Input_file ##Mentioning Input_file name here.
发布于 2018-03-09 09:20:24
您还可以使用这个sed
命令来达到您的目标:
$ sed -n '/metadata:/,/spec:/p' input.yml | grep -oP '(?<=name: ).*'
sss-pod-four
发布于 2018-03-09 11:09:02
您还可以使用GNU grep:
grep -zoP '\n(\s*)metadata:(\n\1\s+.*)+name: \K.*' input.yml
-z
标志将行拆分为零字节,因此可以在单个正则表达式中匹配整个文件内容。-o
只允许grep输出匹配,而-P
启用Perl样式regex,这对于换行符匹配和\K
都是必要的,后者将输出限制为左regex部件后面的无换行符。
与其他解决方案不同的是,您可以适应sed或awk,我首先测量metadata:
行的缩进,然后只在以下行的缩进更高时继续匹配,这样即使spec:
不遵循metadata:
,即使metadata:
不包含name
属性,它也能正确工作。
https://stackoverflow.com/questions/49190209
复制相似问题