извлечь значение из массива и объекта для поля - PullRequest
0 голосов
/ 12 октября 2019

В приведенном ниже json-файле .Principal.AWS содержит значение в одном и массив значений в другом. Если это массив, я использую объединение для объединения значений, а затем для объекта я получаю ошибку

jq: error (at stackflow.json: 46): невозможно перебрать строку ("arn: aws: ia. ..)

Я пробовал jq, даже используя if type = "array", но получая ошибку.

E:\python_test>jq-win32.exe -r ".RoleName + \"  \" + (.AssumeRolePolicyDocument.Statement[] | select (.Principal.AWS? != "null") | (.Principal.AWS |join (\"###\")) ) "  stackflow.json

allow-test-account-to-hostedzones  arn:aws:iam::426544XX7585196:root###arn:aws:iam::640XXX556689289:root
jq: error (at stackflow.json:46): Cannot iterate over string ("arn:aws:ia...)
{
    "RoleName": "AccessKeyRotation-LambdaRole",
    "AssumeRolePolicyDocument": {
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "lambda.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
}
{
    "RoleName": "allow-test-account-to-hostedzones",
    "AssumeRolePolicyDocument": {
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Principal": {
                    "AWS": [
                        "arn:aws:iam::426544XX7585196:root",
                        "arn:aws:iam::640XXX556689289:root"
                    ]
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
}
{
    "RoleName": "allow-test-env-access-to-route53",
    "AssumeRolePolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::445666XX779289:root"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
}

Ожидаемый результат

allow-test-account-to-hostedzones arn:aws:iam::426544XX7585196:root###arn:aws:iam::640XXX556689289:root
allow-test-env-access-to-route53 arn:aws:iam::445666XX779289:root

1 Ответ

1 голос
/ 12 октября 2019

Основная проблема заключается в том, что вы написали "null" вместо null.

Следующий фильтр jq дает желаемый результат:

.RoleName + " " +
  (.AssumeRolePolicyDocument.Statement[]
   | select( .Principal.AWS? != null )
   | .Principal.AWS
   | if type == "array" then join("###") else tostring end )

Чтобы избежать проблем с представлениемэтот фильтр для интерпретатора Windows, я бы посоветовал поместить программу в файл, что, в любом случае, является хорошей идеей.

...