用于在 Yaml 文件中的键内查找键列表的 Shell 脚本

用于在 Yaml 文件中的键内查找键列表的 Shell 脚本

我有一个 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传递pathslength函数。该函数返回数组的长度。

要在 shell 变量中获取此数字,请使用简单的命令替换:

number_of_paths=$( yq '.paths|length' file.yml )

如果您想要条目数的总和tags(可能比顶级paths数组中的条目多得多):

yq '[ .paths[].post.tags | length ] | add' file.yml

以类似的方式,使用yqfromhttps://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

这主要取决于你所说的“钥匙”是什么意思。

相关内容