下面是我的testfile.yaml
:
---
kind: Pod
metadata:
name: amazing-application
---
kind: Deployment
metadata:
name: amazing-deployment
---
kind: Service
metadata:
name: amazing-deployment
---
kind: Service
metadata:
name: tea-service
我的目标是将其拆分为4个文件,文件名为.metadata.name
,文件进入的目录为.kind
。
我已经实现了我想要的:
for kind in $(yq e '.kind' testfile.yaml | awk '!/^(---)/' | uniq);
do
mkdir "$kind"
cd "$kind"
yq 'select(.kind == "'$kind'")' ../testfile.yaml | yq -s '.metadata.name'
cd ..;
done
我想知道的是如何获得一个唯一的togetherMap,或者使用多个条件来分割测试文件,而不是通过循环。
有没有一种方法可以使用yq
和-s
或select
来选择kind和metadata.name在单个文档中的唯一位置(文档以'---'分隔)?
因为如果执行yq -s '.kind' testfile.yaml
,它将生成三个yaml文件,而不是四个。我们得到三个文件,因为不是所有的name
都是唯一的-一个丢失。
2条答案
按热度按时间ijnw1ujt1#
有几种方法可以直接在yq中实现这一点。
首先,您可以使用字符串连接另一个属性来获得唯一的文件名:
这将创建如下文件:
或者你可以使用内置的$index来使文件名唯一:
这将创建:
免责声明:我写了yq
bfrts1fy2#
根据shell脚本的解决方法,您希望将每个文档存储到以
.kind
命名的子目录中以.metadata.name
命名的文件中。但是,yq的拆分选项-s
无法创建子目录,并且在提供-s '.kind + "/" + .metadata.name'
等命名方案时会失败。备选方案:
-s
选项本身也是this way。/
字符替换为其他字符(有效,但不包含在其他名称中),然后使用shell脚本迭代文件,将它们移动并重命名到正确的位置(总共只需要调用一次yq
)。使用_
的示例:ea
)command与[.]
组合以生成文档阵列,然后group_by
在.kind
上将共享给定标准的那些文档收集到子阵列中,最后.[] | split_doc
将这些组再次转换为文档,以便被-s
.捕获。注意,从技术上讲,输出仍然只是(以前的)文档的数组,而不是“真实的的”多文档文件,它们需要另一个
.[] | split_doc
应用于它们中的每一个,以便正确地重新转换它们(这里不包括)。