Como dizer ao jq para imprimir o conteúdo de duas chaves para cada instância retornada por aws ec2 cli

1

executando aws ec2 describe-instances retornará um texto json semelhante ao seguinte:

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

Eu sei que para cada "Instância" eu posso extrair o conteúdo de um único campo, por exemplo, PublicDnsName, usando jq da seguinte forma: jq '.Reservations[].Instances[].PublicDnsName' , que listará os nomes de DNS para minhas instâncias Mas como faço para extrair dois ou mais campos e separá-los por um espaço ou vírgula ou algo assim? Eu quero PublicDnsName e VpcId para ser listado lado a lado para cada instância.

Especificamente, o que estou procurando é uma lista de instâncias em que o VpcId é nulo, indefinido ou inexistente. Em outras palavras, eu gostaria de uma lista de minhas instâncias clássicas e preciso disso através da API para poder processar os resultados.

    
por Michael Martinez 04.10.2016 / 20:11

1 resposta

1

Aqui está uma abordagem usando alguns exemplos de código e dados da minha resposta para uma pergunta semelhante no Stack Overflow.

Para escolher vários campos, você pode usar Objeto de Construção . Por exemplo, este filtro cria um objeto contendo apenas PublicDnsName e VpcId de cada instância:

  .Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}

Se esse filtro estiver em filter.jq e os dados de amostra dessa outra resposta estiverem em data.json , a execução

$ jq -M -f filter.jq data.json

produz

{
  "PublicDnsName": "xxxxxxxx",
  "VpcId": "vpc-eb09eb8e"
}

Depois de ter objetos contendo o que você deseja, os dados em outro formato (por exemplo, csv) são fáceis. Com esse filtro

  .Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}
| [.[]]
| @csv

e a opção -r

$ jq -M -r -f filter.jq data.json

jq produz

"xxxxxxxx","vpc-eb09eb8e"

Para adicionar uma condição de filtragem, por ex. VpcId não é nulo, adicione um selecione .

  .Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}
| select(.VpcId != null)
| [.[]]
| @csv
    
por 06.09.2017 / 07:53