102 lines
5.4 KiB
Markdown
102 lines
5.4 KiB
Markdown
|
---
|
|||
|
title: Поддержка JSONPath
|
|||
|
content_template: templates/concept
|
|||
|
weight: 25
|
|||
|
---
|
|||
|
|
|||
|
{{% capture overview %}}
|
|||
|
Kubectl поддерживает шаблон JSONPath.
|
|||
|
{{% /capture %}}
|
|||
|
|
|||
|
{{% capture body %}}
|
|||
|
|
|||
|
Шаблон JSONPath состоит из выражений JSONPath, заключенных в фигурные скобки {}.
|
|||
|
Kubectl использует JSONPath-выражения для фильтрации по определенным полям в JSON-объекте и форматирования вывода.
|
|||
|
В дополнение к оригинальному синтаксису шаблона JSONPath, допустимы следующие функции и синтаксис:
|
|||
|
|
|||
|
1. Внутри выражений JSONPath текстовые значения заключайте в двойные кавычки.
|
|||
|
2. Используйте операторы `range`, `end`, конечные операторы для перебора списков.
|
|||
|
3. Используйте отрицательные индексы срезов для перехода на предыдущий элемент в списке. Отрицательные индексы не "зацикливаются" в списке и работают пока истинно выражение `-index + listLength >= 0`.
|
|||
|
|
|||
|
{{< note >}}
|
|||
|
|
|||
|
- Оператор `$` необязателен, поскольку по умолчанию выражение всегда начинается с корневого объекта.
|
|||
|
|
|||
|
- Объект результата выводиться через функцию String().
|
|||
|
|
|||
|
{{< /note >}}
|
|||
|
|
|||
|
Все примеры ниже будут ориентироваться на следующий JSON-объект:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"kind": "List",
|
|||
|
"items":[
|
|||
|
{
|
|||
|
"kind":"None",
|
|||
|
"metadata":{"name":"127.0.0.1"},
|
|||
|
"status":{
|
|||
|
"capacity":{"cpu":"4"},
|
|||
|
"addresses":[{"type": "LegacyHostIP", "address":"127.0.0.1"}]
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
"kind":"None",
|
|||
|
"metadata":{"name":"127.0.0.2"},
|
|||
|
"status":{
|
|||
|
"capacity":{"cpu":"8"},
|
|||
|
"addresses":[
|
|||
|
{"type": "LegacyHostIP", "address":"127.0.0.2"},
|
|||
|
{"type": "another", "address":"127.0.0.3"}
|
|||
|
]
|
|||
|
}
|
|||
|
}
|
|||
|
],
|
|||
|
"users":[
|
|||
|
{
|
|||
|
"name": "myself",
|
|||
|
"user": {}
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "e2e",
|
|||
|
"user": {"username": "admin", "password": "secret"}
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Функция | Описание | Пример | Результат
|
|||
|
--------------------|---------------------------|-----------------------------------------------------------------|------------------
|
|||
|
`text` | обычный текст | `kind is {.kind}` | `kind is List`
|
|||
|
`@` | текущий объект | `{@}` | то же, что и ввод
|
|||
|
`.` или `[]` | оператор выбора по ключу | `{.kind}`, `{['kind']}` или `{['name\.type']}` | `List`
|
|||
|
`..` | рекурсивный спуск | `{..name}` | `127.0.0.1 127.0.0.2 myself e2e`
|
|||
|
`*` | шаблон подстановки. Получение всех объектов | `{.items[*].metadata.name}` | `[127.0.0.1 127.0.0.2]`
|
|||
|
`[start:end:step]` | оператор индексирования | `{.users[0].name}` | `myself`
|
|||
|
`[,]` | оператор объединения | `{.items[*]['metadata.name', 'status.capacity']}` | `127.0.0.1 127.0.0.2 map[cpu:4] map[cpu:8]`
|
|||
|
`?()` | фильтрация | `{.users[?(@.name=="e2e")].user.password}` | `secret`
|
|||
|
`range`, `end` | перебор списка | `{range .items[*]}[{.metadata.name}, {.status.capacity}] {end}` | `[127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]]`
|
|||
|
`''` | интерпретируемая в кавычках строка | `{range .items[*]}{.metadata.name}{'\t'}{end}` | `127.0.0.1 127.0.0.2`
|
|||
|
|
|||
|
Примеры использования `kubectl` и JSONPath-выражений:
|
|||
|
|
|||
|
```shell
|
|||
|
kubectl get pods -o json
|
|||
|
kubectl get pods -o=jsonpath='{@}'
|
|||
|
kubectl get pods -o=jsonpath='{.items[0]}'
|
|||
|
kubectl get pods -o=jsonpath='{.items[0].metadata.name}'
|
|||
|
kubectl get pods -o=jsonpath="{.items[*]['metadata.name', 'status.capacity']}"
|
|||
|
kubectl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.startTime}{"\n"}{end}'
|
|||
|
```
|
|||
|
|
|||
|
{{< note >}}
|
|||
|
В Windows нужно заключить в _двойные_ кавычки JSONPath-шаблон, который содержит пробелы (не в одинарные, как в примерах выше для bash). Таким образом, любые литералы в таких шаблонов нужно оборачивать в одинарные кавычки или экранированные двойные кавычки. Например:
|
|||
|
|
|||
|
```cmd
|
|||
|
kubectl get pods -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.status.startTime}{'\n'}{end}"
|
|||
|
kubectl get pods -o=jsonpath="{range .items[*]}{.metadata.name}{\"\t\"}{.status.startTime}{\"\n\"}{end}"
|
|||
|
```
|
|||
|
{{< /note >}}
|
|||
|
|
|||
|
{{% /capture %}}
|