问题描述
我正在检查通过管道传输到SecurityGroups
生成的多个输出的每个输出(在这种情况下,为aws ec2 describe-instances
命令的xargs
字段)的属性,如下所示:
cat /tmp/ip_addresses | xargs -I {} sh -c "aws ec2 describe-instances --filter Name=private-ip-address,Values={} | jq '.Reservations[].Instances[].SecurityGroups[]'"
一个aws ec2 describe-instance
调用的输出示例可能是这样的:
{
"ImageId": "ami-0d093cc932863f7a9","InstanceId": "i-0b0bcbf0b766504ea",...
"IamInstanceProfile": {
"Arn": "arn:aws:iam::blahblah","Id": "AIPAJ4P46HO5Z322JQHWA"
},...,"SecurityGroups": [
{
"GroupName": "usw2-staging-zookeeper-serv","GroupId": "sg-da9361a1"
}
],...
}
某些实例具有多个1个安全组,并且输出之间没有明显分开。因此,对于25个实例,我获得了28个安全组对象。这使我很难区分哪个安全组适用于哪个实例。是否可以像水平线一样在每个xargs
输出之间打印出分隔符,以便我可以轻松分辨出哪个输出映射到了哪个实例?
解决方法
您有多种选择。要按照您的描述添加分隔符,只需将其添加到您的shell命令中:; printf '---\n'
cat /tmp/ip_addresses | xargs -I {} sh -c "aws ec2 describe-instances --filter Name=private-ip-address,Values={} | jq '.Reservations[].Instances[].SecurityGroups[]'; printf '---\n'"
或者您可以从jq查询输出.Reservations[].Instances[]|{InstanceId,SecurityGroups}
cat /tmp/ip_addresses | xargs -I {} sh -c "aws ec2 describe-instances --filter Name=private-ip-address,Values={} | jq '.Reservations[].Instances[]|{InstanceId,SecurityGroups}'"
我没有访问AWS的权限,但是对于每个实例,应该为您提供一个对象,该实例只有两个字段-InstanceId和SecurityGroups数组。
最后,如果您要为每个安全组输出一个对象,但仍用InstanceId标记它们,则可以执行以下操作:.Reservations[].Instances[]|{InstanceId,SecurityGroup:.SecurityGroups[]}
cat /tmp/ip_addresses | xargs -I {} sh -c "aws ec2 describe-instances --filter Name=private-ip-address,SecurityGroup:.SecurityGroups[]}'"