Как указать jq печатать несколько полей (ключей) из aws ec2 cli

запуск aws ec2 description-instances вернет текст json, подобный следующему:

{
    "Reservations": [
        {
            "Instances": [
                  "PublicDnsName": "ec2..."
                    "VpcId": "vpc-...",
                        ...
            "Instances": [

Я знаю, что для каждого «Экземпляра» я могу извлечь содержимое одного поля, например PublicDnsName, используя jq следующим образом: jq '.Reservations[].Instances[].PublicDnsName', в котором будут перечислены имена DNS для моих экземпляров. Но как мне извлечь два или более полей и разделить их на пробел или запятая или что? Я хочу, чтобы PublicDnsName и VpcId были указаны рядом для каждого экземпляра.

В частности, я ищу список экземпляров, где VpcId имеет значение null, не определено или не существует. Другими словами, мне нужен список моих классических экземпляров, и мне нужно это через API, чтобы я мог обрабатывать результаты.


person Michael Martinez    schedule 05.10.2016    source источник


Ответы (1)


Работа только с AWS CLI

Мне нравится jq, и его действительно очень полезно сочетать с aws cli, но в вашем случае вы уже можете многое сделать просто с помощью aws cli.

Но как извлечь два или более полей и разделить их пробелом, запятой или чем-то еще? Я хочу, чтобы PublicDnsName и VpcId были указаны рядом для каждого экземпляра.

aws ec2 describe-instances --query '
  Reservations[*].Instances[].{PublicDnsName:PublicDnsName,VpcId:VpcId}' --output text

В частности, я ищу список экземпляров, где VpcId имеет значение null, undefined или не существует.

Если вы ищете пустой VpcId, будет работать следующее:

aws ec2 describe-instances --query '
  Reservations[].Instances[?VpcId==``].[PublicDnsName]' --output text

Работа с jq

Поскольку исходный вопрос

Как указать jq печатать несколько полей (ключей) из aws ec2 cli

уверен, что вы можете работать с jq, вы можете получить несколько полей со следующим, разделив их запятой

aws ec2 describe-instances |\
  jq '.Reservations[].Instances[].PublicDnsName, .Reservations[].Instances[].VpcId'

Вы можете лучше записать это, разложив на множители Reservations[].Instances:

aws ec2 describe-instances |\
  jq '.Reservations[].Instances[] | .PublicDnsName, .VpcId'

а jq поддерживает преобразование в csv, но он должен принимать массив и, чтобы избежать проблем с двойными кавычками, вы можете работать с необработанными данными:

aws ec2 describe-instances |\
  jq -r '.Reservations[].Instances[]
         | [.PublicDnsName, .VpcId]
         | @csv'

Последний просто произведет ожидаемый результат:

"ec2-some_id_region.amazonaws.com","vpc-some_other_id"
person Frederic Henri    schedule 05.10.2016
comment
Спасибо за информацию. У меня работает факторинг через | .PublicDnsName, .VpcId. - person Michael Martinez; 05.10.2016
comment
Еще один полезный вариант: aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [.PrivateDnsName, .VpcId, .PublicDnsName]|@tsv' - person Alec Istomin; 03.02.2018