我有一个类似下面的yaml数组,
identitymappings:
- arn: "arn:aws:iam::12345567:role/AdmRole"
group: "system:masters"
user: "user1"
- arn: "arn:aws:iam::12345567:role/TestRole"
group: "system:masters"
user: "user2"我正在尝试使用for loop和yq在bash脚本中解析这个yaml。
for identityMapping in $(yq read test.yaml "identitymappings[*]"); do
roleArn=$identityMapping["arn"]
group=$identityMapping.group
user=$identityMapping.user
done但是我没有得到预期的结果,比如不能获取roleArn、group、user的值。请让我知道如何解决这个问题。
发布于 2020-07-15 00:29:39
从jq或yq读取到bash的最简单方法是使用BashFAQ #1 while read循环来处理面向行的数据;在下面的代码中,我们使用@tsv来生成面向行的输出:
while IFS=$'\t' read -r roleArn group user _; do
echo "Role: $roleArn"
echo "Group: $group"
echo "User: $user"
done < <(yq -j read test.yaml \
| jq -r '.identitymappings[] | [.arn, .group, .user] | @tsv')请注意,如果您使用的是the Python yq而不是the Go one,则可以删除yq -j read,只使用yq -r '...'代替jq -r '...'。
发布于 2021-11-29 22:58:30
我这样做的方式是:
# load array into a bash array
# need to output each entry as a single line
readarray identityMappings < <(yq e -o=j -I=0 '.identitymappings[]' test.yml )
for identityMapping in "${identityMappings[@]}"; do
# identity mapping is a yaml snippet representing a single entry
roleArn=$(echo "$identityMapping" | yq e '.arn' -)
echo "roleArn: $roleArn"
done输出:
roleArn: arn:aws:iam::12345567:role/AdmRole
roleArn: arn:aws:iam::12345567:role/TestRole免责声明:我写了yq
发布于 2021-10-10 12:42:12
@Rad4的答案有一个改进,对我有效。
您可以通过以下方式灵活地循环使用最新的yq和jq:
for im in $(yq eval -o=j test.yaml | jq -cr '.identitymappings[]'); do
arn=$(echo $im | jq -r '.arn' -)
group=$(echo $im | jq -r '.group' -)
user=$(echo $im | jq -r '.user' -)
echo $arn $group $user
done这个循环通过有效的在线jsons,这使得jq仍然在循环中工作。
https://stackoverflow.com/questions/62898925
复制相似问题