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

print out a separator in between different outputs for a piped xargs command

我正在检查每个输出的属性(在本例中,aws ec2 describe-instances 命令的 SecurityGroups 字段)来自通过管道生成的多个输出到 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,Values={} | jq '.Reservations[].Instances[]|{InstanceId,SecurityGroup:.SecurityGroups[]}'"