Поиск строки с JQ на любом уровне - PullRequest
0 голосов
/ 18 января 2019

Я хочу использовать jq для извлечения любого появления ключа Action в файле JSON. Action появляется в JSON несколько раз в разных путях (или в одной и той же структуре ключа-пути с разными значениями).

Вариант использования - извлечь все политики IAM, которые предоставляют разрешения *.

Я хочу выбрать случаи, в которых .Action - это значение "*" или массив с "*" в качестве элемента, например

"Action":["not this", "*", "not that"]

В качестве плюса было бы неплохо включить фрагмент JSON, содержащий "Action" до некоторых уровней выше.

Например, этот JSON:

    {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "*",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    }
                }
            ]
        },
        ...

Будет извлечено

    {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "*",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    }
                }
            ]
        },
        ...
    }

Это достижимо с jq и как?

1 Ответ

0 голосов
/ 18 января 2019

Получение путей и объектов, удовлетворяющих условию

[В этом разделе рассматривается вопрос в первоначальном виде, то есть когда в вопросе конкретно задаются пути к интересующим объектам.]

paths(objects and has("Action") 
      and (.Action == "*" or (.Action|index("*")))) as $path
| [ $path, getpath($path)]

Свертывание ввода на основе критерия выбора

. as $in
| reduce paths(objects and has("Action")
               and (.Action == "*" or (.Action|index("*")))) as $path
    ({}; setpath($path; $in | getpath($path)))

Учитывая входные данные, аналогичные показанным в Q, фильтр, приведенный выше, даст:

{
  "AssumeRolePolicyDocument": {
    "Statement": [
      {
        "Action": "*",
        "Effect": "Allow",
        "Principal": {
          "Service": "ec2.amazonaws.com"
        }
      }
    ]
  }
}
...