JQ数组溢出CSV列

时间:2018-12-07 21:33:29

标签: json csv jq

我需要提取一个具有实例ID和公共IP的AWS实例列表,并将其以csv格式输出到电子表格。

这是我正在使用的ORIGINAL JSON(外部IP信息已被遮盖)。

这是我正在使用的命令:

class QHklCircleItem(QGraphicsEllipseItem):
    def __init__(self, kx, ky, radius, facecolor=(0, 0, 0, 1), edgecolor=(0, 0, 0, 0), hoverpen=(1, 0, 0, 1),
             linewidth=0):
        super().__init__()
        self.radius = radius
        self.facecolor = QBrush(QColor.fromRgbF(*facecolor))

        self.hoverpen = QPen(QColor.fromRgbF(*hoverpen))
        self.hoverpen.setWidth(2)
        self.hoverpen.setCosmetic(True)

        self.edgecolor = QPen(QColor.fromRgbF(*edgecolor))
        self.edgecolor.setWidth(linewidth)
        self.edgecolor.setCosmetic(True)
        self.setAcceptHoverEvents(True)
        self.setPos(kx, ky)

        self.setRect(radius, radius, radius, radius)
        self.setPen(self.edgecolor)
        self.setBrush(self.facecolor)

    def hoverEnterEvent(self, event):
        super().hoverEnterEvent(event)
        self.setPen(self.hoverpen)

    def hoverLeaveEvent(self, event):
        super().hoverLeaveEvent(event)
        self.setPen(self.edgecolor)

这有效!但是,如果有多个公共IP,就会出现问题。

使用一个公共IP,输出看起来不错:

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

使用多个公共IP时,输出会溢出CSV传播表中的列:

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

我想知道如何使用JQ命令用空格替换逗号(以便csv可以将它们放在同一列中),还用空格替换空值(对于没有公共IP的AWS实例)。 / p>

我省去了创建额外列的代码,因此我们可以专注于最大的问题是公共IP。

1 个答案:

答案 0 :(得分:2)

请勿使用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之间仍然有逗号,但是这些逗号将在引号内,因此被兼容的解析器视为一个字段中的数据,而不是两个字段之间的分隔。