在管道输出的xargs命令的不同输出之间打印出分隔符

问题描述

我正在检查通过管道传输到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[]}'"