为管道 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[]}'"
我正在检查每个输出的属性(在本例中,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[]}'"