JQ: ошибка: не может перебрать ноль (ноль) - PullRequest
0 голосов
/ 25 апреля 2019

В приведенном ниже файле Json я пытаюсь извлечь «Имя»: «abcd», «Версия»: «1.0.2» и «Серьезность»: «Средний».

"status": "scanned",
    "data": {
        "Layer": {
            "IndexedByVersion": 3,
            "NamespaceName": "debian:9",
            "ParentName": "e762",
            "Name": ".4530bfac-5e99-4138-b071-4286c06669a3",
            "Features": [
                {
                    "Name": "openssl1.0",
                    "VersionFormat": "dpkg",
                    "NamespaceName": "debian:9",
                    "AddedBy": "85aa73fb8281cc252ed7e151f10386f36588ec6c967d45136103a4e1e705a81c.01bc7eff-9a5d-43f5-ab14-2e3e470cba77",
                    "Version": "1.0.2q-1~deb9u1",
                    "Vulnerabilities": [
                        {
                            "Severity": "Medium",
                            "NamespaceName": "debian:9",
                            "Link": "xxxx",
                            "FixedBy": "1.0.2r-1~deb9u1",
                            "Description": " n must call SSL_shutdown() twice even if a protocol error has occurred (applications should not do this but some do anyway). Fixed in OpenSSL 1.0.2r (Affected 1.0.2-1.0.2q).",
                            "Name": "CVE-2019-1559",
                            "Metadata": {
                                "NVD": {
                                    "CVSSv2": {
                                        "Score": 4.3,
                                        "Vectors": "AV:N/AC:M/Au:N/C:P/I:N"
                                    }
                                }
                            }
                        }
                    ]
                },
                {
                    "VersionFormat": "dpkg",
                    "NamespaceName": "debian:9",
                    "Version": "0.16-1+deb9u1",
                    "Name": "libidn2-0",
                    "AddedBy": "85aa73fb8281cc252ed7e151f10386f36588ec6c967d45136103a4e1e705a81c.01bc7eff-9a5d-43f5-ab14-2e3e470cba77"
                },
                {
                    "VersionFormat": "dpkg",
                    "NamespaceName": "debian:9",
                    "Version": "0.29-4",
                    "Name": "pkg-config",
                    "AddedBy": "4d2169f1dc7652ffd2a4f32d2c0ae2
                },


                {
                    "Name": "nettle",
                    "VersionFormat": "dpkg",
                    "NamespaceName": "debian:9",
                    "AddedBy": "7494d6c991278b43e8388f7cec2f138075
                    "Version": "3.3-1",
                    "Vulnerabilities": [
                        {
                            "Severity": "Low",
                            "NamespaceName": "debian:9",
                            "Link": "xxxx",
                            "Description": "er.",
                            "Name": "CVE-2018-16869",
                            "Metadata": {
                                "NVD": {
                                    "CVSSv2": {
                                        "Score": 3.3,
                                        "Vectors": ":P"
                                    }

Пока что я могу извлечь значения имени и версии, используя команду jq ниже.

jq -r '.data.Layer| .Features[] | "\(.Name) \(.Version)"' status.json

но когда я пытаюсь извлечь значения из поля "Серьезность", используя команду ниже

`jq -r '.data.Layer| .Features[] | "\(.Name) \(.Version)"| .Vulnerabilities[].Severity' status.json`

Я получаю сообщение об ошибке в заголовке.

Required output: abcd 12.0 medium

Любая помощь очень ценится.

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Слегка меняет формат вывода:

jq -r '.data.Layer| .Features[] | .Name ,.Version, .Vulnerabilities[].Severity' input

Но это также работает:

jq -r '.data.Layer| .Features[] | "\(.Name)  \(.Version)  \(.Vulnerabilities[].Severity)"' input
1 голос
/ 25 апреля 2019

, если приемлемо альтернативное решение, позвольте мне предложить вам решение, основанное на инструменте Unix с обходным путем для JSON: jtc (с учетом вашего комментария к Уильяму):

Таким образом, вы будете собирать Name, Version и Severity только предикатную Severity запись, присутствующую в Vulnerabilities (и, очевидно, если запись Vulnerabilities существует):

bash $ <status.json jtc -x'<Features>l[:][Vulnerabilities]<Severity>l[^4]' -y'[Name]' -y'[Version]' -y'<Severity>l' 
"openssl1.0"
"1.0.2q-1~deb9u1"
"Medium"
"nettle"
"3.3-1"
"Low"
bash $ 

И, если вы хотите сгруппировать их в каждой строке, перенаправьте их на xargs или paste:

bash $ <status.json jtc -x'<Features>l[:][Vulnerabilities]<Severity>l[^4]' -y'[Name]' -y'[Version]' -y'<Severity>l' | xargs -L3
openssl1.0 1.0.2q-1~deb9u1 Medium
nettle 3.3-1 Low
bash $ 

Раскрытие информации: я создатель jtc инструмент

...