我有一个 yaml 文件
info:
description: Api
contact:
name: Api
tags:
- name: ""
description: ""
paths:
/data1/1:
post:
tags:
- "tag1"
/data2/2:
post:
tags:
- "tag2"
/data3/3:
post:
tags:
- "tag3"
我想获取下面按键的数量paths:
键,即3
这里。在 shell 脚本中需要这个。
答案1
假设“number of key under paths
”指的是该部分下的顶级条目的数量paths
(而不是全部的键的数量,即 12)。在答案的最后,我展示了如何计算tags
条目数。
使用yq
来自https://kislyuk.github.io/yq/:
yq '.paths|length' file.yml
输出将3
用于您的示例文档。
表达式将数组.paths|length
传递paths
给length
函数。该函数返回数组的长度。
要在 shell 变量中获取此数字,请使用简单的命令替换:
number_of_paths=$( yq '.paths|length' file.yml )
如果您想要条目数的总和tags
(可能比顶级paths
数组中的条目多得多):
yq '[ .paths[].post.tags | length ] | add' file.yml
以类似的方式,使用yq
fromhttps://mikefarah.gitbook.io/yq/:
yq eval '.paths|length' file.yml
或者,为了存储在变量中,
number_of_paths=$( yq eval '.paths|length' file.yml )
tags
或者,如果它是您想要的数组长度的总和:
yq eval '[ .paths[].post.tags | length ] | .[] as $item ireduce(0; . + $item)' file.yml
答案2
如果你不能使用任何一个yq
解析器,也许你可以使用 perl 的YAML::小模块?
$ perl -MYAML::Tiny -E '
my $yaml = YAML::Tiny->read("file.yaml"); say scalar keys %{ $yaml->[0]->{"paths"} }
'
3
答案3
这可能是您想要做的,在每个 Unix 机器上的任何 shell 中使用任何 awk:
$ awk '!/^ /{f=/^paths:/} f && /^ \//{cnt++} END{print cnt+0}' file
3
这主要取决于你所说的“钥匙”是什么意思。