我需要提取一个具有实例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。
答案 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之间仍然有逗号,但是这些逗号将在引号内,因此被兼容的解析器视为一个字段中的数据,而不是两个字段之间的分隔。