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
ここで。これはシェルスクリプトで必要です。
答え1
「下のキー数paths
」は、セクションの下の最上位項目数を参照していると仮定しますpaths
。みんなキー数、すなわち12)。答えが終わったら、tags
アイテムの数を計算する方法を示します。
yq
以下で使用https://kislyuk.github.io/yq/:
yq '.paths|length' file.yml
出力は3
サンプル文書に使用されます。
式は配列を関数.paths|length
に渡します。この関数は配列の長さを返します。paths
length
シェル変数からこの数値を取得するには、単純なコマンド置換を使用します。
number_of_paths=$( yq '.paths|length' file.yml )
アイテム数の合計が必要な場合(最上位配列にあるよりも多いtags
可能性があります):paths
yq '[ .paths[].post.tags | length ] | add' file.yml
同様にyq
from を使用します。https://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システムのすべてのシェルでawkを使用して実行したいことです。
$ awk '!/^ /{f=/^paths:/} f && /^ \//{cnt++} END{print cnt+0}' file
3
主に「キー」の意味によって異なります。