【问题标题】:JQ Array Overflows CSV ColumnJQ 数组溢出 CSV 列
【发布时间】:2018-12-07 21:33:28
【问题描述】:

我需要提取 AWS 实例及其实例 ID 和公共 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 可以将它们放在同一列中)以及将空值替换为空格(对于没有公共 IP 的 aws 实例)。

我将省略创建额外列的代码,以便我们可以专注于公共 IP,这是最大的问题。

【问题讨论】:

  • 是的,这就是没有@csv 选项的工作方式。如果你输出到@csv,那么所有的条目都用引号括起来,即使 -r 在那里。所以我使用 sed 删除仍然存在的引号,因为我们正在输出到 csv。
  • 您是否考虑过使用 TSV 代替 CSV?
  • 但引号是 csv 格式的一部分。这是一个特性,而不是一个错误。如果解析您的输出的代码不理解这些引号,那么它就不是真正兼容的 CSV 解析器(并且您想要的格式也不是真正的 CSV)。
  • 不,我没有尝试过使用 TSV。我只是不想在我发布的电子表格中引用引号。我只是将 CSV 用作“阅读表友好”格式。
  • 在 Excel(或您选择的电子表格)中打开您的 CSV,而无需先使用 sed 对其进行修改。您不会将那里的引号视为文字数据;它们是语法,而不是语义。

标签: json csv jq


【解决方案1】:

不要使用sed 删除引号。引号不仅重要,而且关键

考虑以下示例:

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

该代码发出一行,实际上是一个有效的 3 单元 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 之间仍然有逗号,但这些逗号将在引号内,因此被兼容的解析器视为字段内的数据 - 而不是两个字段之间的拆分。

【讨论】:

  • 谢谢。当我使用没有 sed 的线路时:aws ec2 describe-instances --profile=company-prod | jq -r '.Reservations[].Instances[] | [ .InstanceId, .NetworkInterfaces[].PrivateIpAddresses[].Association.PublicIp // null ] | @csv' It still outputs the public IPs with commas between each one. So it's still overflowing the spread sheet columns: "i-9a123466b","54.xx.xx.201","52.x.xx.160","52.x.xx.175","34. xx.xx.31"`
  • 您能否提供没有 EC2 帐户的人可以用来重现/测试的 JSON?基本上,您需要确保您的 IP 在单个字段中,而不是被 JQ 视为一个序列。无法运行就无法测试对 JQ 代码的更改,如果没有作为输入的 JSON 就无法运行它。
  • 当然!我一会儿就有。非常感谢!
  • 添加了旨在解决该问题的更改草案,但在数据可用之前未经测试。 :)
  • 哈。嗯不错。真的很感激。我只需要花一点时间来清理 json 输出。如果安全扫描互联网并发现属于公司在互联网上闲逛的 IP 等,我会在工作中受到重创。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 2019-04-26
  • 2019-01-15
  • 1970-01-01
相关资源
最近更新 更多