Перебор элементов внутри объекта

Я пытаюсь проанализировать вывод json одного из наших кластеров es, чтобы собрать статистику кеша фильтров, и надеялся использовать для этого Jq. Вот вывод команды curl:

{
  "_shards": {
    "total": 5662,
    "successful": 5662,
    "failed": 0
  },
  "_all": {
    "primaries": {
      "filter_cache": {
        "memory_size": "32.8gb",
        "memory_size_in_bytes": 35245081088,
        "evictions": 31347095
      }
    },
    "total": {
      "filter_cache": {
        "memory_size": "94.3gb",
        "memory_size_in_bytes": 101307321504,
        "evictions": 79329152
      }
    }
  },
  "indices": {
    "oreserverdk04180047": {
      "primaries": {
        "filter_cache": {
          "memory_size": "0b",
          "memory_size_in_bytes": 0,
          "evictions": 11
        }
      },
      "total": {
        "filter_cache": {
          "memory_size": "0b",
          "memory_size_in_bytes": 0,
          "evictions": 132
        }
      }
    },
    "janbe10200002": {
      "primaries": {
        "filter_cache": {
          "memory_size": "0b",
          "memory_size_in_bytes": 0,
          "evictions": 88
        }
      },
      "total": {
        "filter_cache": {
          "memory_size": "0b",
          "memory_size_in_bytes": 0,
          "evictions": 119
        }
      }
    }
  }
}

В основном я хотел бы, чтобы вывод выглядел примерно так:

oreserverdk04180047 0b
janbe10200002 0b

Мне просто нужно имя индекса и столбец memory_size из «всего». Я могу получить это, если запущу это через жесткое кодирование имен индексов как таковых:

jq '. | {memory_size: .indices.janbe10200002.total.filter_cache.memory_size}'

Но я надеялся использовать какой-то подстановочный знак для имени индекса.


person KLD    schedule 22.12.2015    source источник


Ответы (2)


jq -r  '
  .indices
  | to_entries[]
  | "\(.key) \(.value.total.filter_cache.memory_size)"
' input.json

Выход:

oreserverdk04180047 0b
janbe10200002 0b
person peak    schedule 22.12.2015

Вот решение, использующее foreach

  .indices
| foreach keys[] as $k (
      .
    ; .
    ; "\($k) \(.[$k].total.filter_cache.memory_size)"
  )

РЕДАКТИРОВАТЬ: теперь я понимаю, что фильтр формы foreach E as $X (.; .; R) почти всегда можно переписать как E as $X | R, поэтому приведенное выше действительно просто

  .indices
| keys[] as $k
| "\($k) \(.[$k].total.filter_cache.memory_size)"
person jq170727    schedule 04.08.2017