如何提取k8s YAML文件中首次出现的name字段的文本值
解决方法
推荐方案:使用YAML专用处理工具yq(最稳定,不会受YAML格式变动影响)
k8s的YAML属于结构化数据,用结构化解析工具处理最稳妥,不会因为空格、注释、字段顺序变化导致匹配错误:
- 单个文件提取:
# 主流Go实现的mikefarah/yq直接执行即可 yq '.metadata.name' deployment.yaml # 如果是Python实现的旧版yq,加-r参数输出无引号的原始值 yq -r '.metadata.name' deployment.yaml
- 批量提取当前目录所有Deployment YAML的对应name:
yq '.metadata.name' *.yaml
直接输出结果就是你需要的nginx-deployment。
无yq时的文本处理方案
如果环境无法安装额外工具,可以用awk直接定位metadata区块下的name字段,避免匹配到后续容器的name:
awk '/^metadata:/{flag=1; next} flag && /^ name:/{print $2; exit}' deployment.yaml
逻辑说明:匹配到行首为metadata:的行后开启标记,后续匹配到行首带2个空格的name:行时,直接输出第二列内容并退出,只会取到metadata下的第一个name值。
原命令出错原因
- 无过滤的
grep 'name: '会匹配YAML中所有包含name:的行,包括后续containers字段下的容器name,会得到多个多余结果 - sed的替换规则中没有定义捕获组,
s/name: /\1/p里没有用()包裹要提取的内容,\1引用的是空值,所以输出为空。
内容的提问来源于stack exchange,提问作者karlos
相关产品推荐
相关产品推荐

