запуск aws ec2 describe-instance вернет текст json, подобный следующему:
{
"Reservations": [
{
"Instances": [
"PublicDnsName": "ec2..."
"VpcId": "vpc-...",
...
"Instances": [
Я знаю, что для каждого «экземпляра» я могу извлечь содержимое одного поля, например PublicDnsName, используя jq следующим образом: jq '.Reservations[].Instances[].PublicDnsName'
в котором будут перечислены DNS-имена для моих экземпляров. Но как мне извлечь два или более поля и разделить их пробелом, запятой или чем-то еще? Я хочу, чтобы PublicDnsName и VpcId отображались рядом для каждого экземпляра.
В частности, я ищу список случаев, когда VpcId имеет значение null, undefined или не существует. Другими словами, мне нужен список моих классических экземпляров, и он мне нужен через api, чтобы я мог обработать результаты.
Вот подход с использованием примера кода и данных из мой ответ на аналогичный вопрос о переполнении стека.
Чтобы выбрать несколько полей, вы можете использовать Строительство объекта. Например, этот фильтр создает объект, содержащий только PublicDnsName
и VpcId
из каждого экземпляра:
.Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}
Если этот фильтр находится в filter.jq
и образцы данных из этого другого ответа находятся в data.json
затем бег
$ jq -M -f filter.jq data.json
производит
{
"PublicDnsName": "xxxxxxxx",
"VpcId": "vpc-eb09eb8e"
}
Если у вас есть объекты, содержащие то, что вы хотите, легко преобразовать данные в другой формат (например, csv). С этим фильтром
.Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}
| [.[]]
| @csv
и -r
вариант
$ jq -M -r -f filter.jq data.json
jq производит
"xxxxxxxx","vpc-eb09eb8e"
Чтобы добавить условие фильтрации, например VpcId не равен нулю, добавьте Выбрать.
.Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}
| select(.VpcId != null)
| [.[]]
| @csv