Как я могу отфильтровать записи, которые НЕ содержат пару ключ-значение во вложенном массиве

Допустим, у меня есть следующий вывод JSON:

{
 "Stacks": [
        {
            "StackName": "hello-world",
            "Tags": [
                {
                    "Key": "environment",
                    "Value": "sandbox"
                },
                {
                    "Key": "Joe Shmo",
                    "Value": "Dev"
                }
            ]
        },
        {
            "StackName": "hello-man",
            "Tags": [
                {
                    "Key": "environment",
                    "Value": "live"
                },
                {
                    "Key": "Tandy",
                    "Value": "Dev"
                }
            ]
        }
    ]
}

Как бы я написал jq запрос, чтобы захватить все StackNameдля стеков, которые не имеют Tags значение "Key": "Joe Shmo"? Так что результат вернется просто hello-man,

2 ответа

Решение

С помощью contains, как это:

jq -r '.Stacks[]|select(.Tags|contains([{"Key": "Joe Shmo"}])|not).StackName'

Замечания: -r удаляет кавычки из вывода, в противном случае jq будет печатать "hello-man" (в двойных кавычках)

.Stacks[]
| select( any(.Tags[]; .Key == "Joe Shmo" ) | not)
| .StackName

Это проверяет на равенство эффективно (any имеет семантику короткого замыкания), тогда как contains будет проверять на сдерживание.

Другие вопросы по тегам