JQ Array переполняет столбец CSV - PullRequest
0 голосов
/ 08 декабря 2018

Мне нужно получить список экземпляров AWS с их идентификатором экземпляра и общедоступным IP-адресом и вывести его в электронную таблицу в формате csv.

Вот ORIGINAL JSON , с которым я работаю (внешний IP-адрес скрыт).

Я использую эту команду:

aws ec2 describe-instances --profile="$aws_account"  | jq -r '.Reservations[].Instances[] | [ .InstanceId,  .NetworkInterfaces[].PrivateIpAddresses[].Association.PublicIp // null] | @csv'

Это работает!Но проблема возникает, если существует более одного общедоступного IP-адреса.

При одном общедоступном IP-адресе вывод выглядит хорошо:

AWS Instance ID    | Public IP
i-0e636f1d0f0009f78,18.xxx.xx.112

При наличии более одного общедоступного IP-адреса выходные данные переполняют столбцы вЛист CSV:

   AWS Instance ID | Public IP     |Key Name    Owner     Instance State

   i-9a02a66b      ,54.xx.xx.201,52.x.xxxx.160,52.x.xx.175,34.xx.xx.31

Я хотел бы знать, как использовать команду JQ для замены запятых пробелами (чтобы csv мог разместить их в одном столбце), а также для замены пустых значений пробелом (для экземпляров aws без публичного IP-адреса).

Я опускаю код, который создает дополнительные столбцы, чтобы мы могли сосредоточиться на публичных IP-адресах, что является самой большой проблемой.

1 Ответ

0 голосов
/ 08 декабря 2018

Не используйте sed для удаления кавычек.Кавычки не просто важные , они критические .

Рассмотрим следующий пример:

jq -Rnr '[inputs] | @csv' <<EOF
first item
second item,has,commas
third item
EOF

Этот код выдает одну строку, , который на самом деле является действительным трехэлементным CSV :

"first item","second item,has,commas","third item"

Посмотрите, как запятые, являющиеся данными, находятся внутри кавычек, тогда как запятые, которые являются синтаксисом, находятся вне их?Это критический элемент синтаксиса CSV.


Это только когда вы избавляетесь от кавычек, защищающих те запятые, с которыми вы заканчиваете:

first item,second item,has,commas,third item

... гдеданные анализируются как 5 ячеек вместо 3.


Чтобы фактически гарантировать, что ваши IP-адреса передаются в @csv как одно поле, вы можете присоединиться к ним заранее;это может быть что-то вроде:

jq -r '
  .Reservations[].Instances[]
  | [ .InstanceId,
      ([.NetworkInterfaces[].PrivateIpAddresses[].Association.PublicIp // null
       ] | join(","))
    ] | @csv'

Это все еще содержит запятые между IP-адресами, но эти запятые будут внутри кавычек , и, таким образом, будут рассматриваться как данные в поле, а не какразделить между двумя полями - совместимым парсером.

...