Linux 从AWS CLIi管道输出到特定行上的现有文件

Linux 从AWS CLIi管道输出到特定行上的现有文件,linux,bash,amazon-web-services,awk,sed,Linux,Bash,Amazon Web Services,Awk,Sed,我目前正在编写一个Ansible Playbook,我正在寻找一个命令,该命令可以获取AWS的私有IP地址,并将它们放在现有文件中的某一行 我能做第一部分: aws ec2 describe-instances --filters "Name=tag:Name,Values=ams*" "Name=instance-state-name,Values=running" --query "Reservations[].Instances[][PrivateIpAddress]" 但是,我想通过

我目前正在编写一个Ansible Playbook,我正在寻找一个命令,该命令可以获取AWS的私有IP地址,并将它们放在现有文件中的某一行

我能做第一部分:

aws ec2 describe-instances --filters "Name=tag:Name,Values=ams*" "Name=instance-state-name,Values=running" --query "Reservations[].Instances[][PrivateIpAddress]" 
但是,我想通过管道将其传输到从第2行开始的文件(inventory.ini)

我想我应该使用
sed
awk
,但我不知道如何将变量传递到这些实用程序中。我想在一个命令中完成这一切-类似于:

aws command | sed -i '' '2s/.*/[command output]/' inventory.ini

将AWS命令放在命令替换的内部。在shell中,
$()
中的任何内容都将运行该命令,并将命令的输出放在该位置。因此,如果您的
sed
正确,您可以:

sed -i '' "2s/.*/$(aws command)/" inventory.ini
注意,我将第二组引号切换为双引号,这样插值就可以工作了

附录:引用AWS命令 因为您的AWS命令包含双引号部分,所以将其放在双引号
sed
参数中是行不通的。您可以用单引号替换命令中的所有双引号,但在某些情况下,这可能不起作用。一般来说,更容易将其分为两个步骤:

AWS_OUTPUT=$(aws command)
sed -i '' "2s/.*/$AWS_OUTPUT/" inventory.ini
试试这个:

aws ec2 describe-instances --filters "Name=tag:Name,Values=ams*" \
    "Name=instance-state-name,Values=running" \
    --query "Reservations[].Instances[][PrivateIpAddress]" \
     | sed -i '1r /dev/stdin' inventory.ini
sed命令
1r/dev/stdin
mean“在读取第1行后,从stdin读取所有内容”。

尝试jq: jq是一个json解析工具,您可以在这里获得:

我已经在做类似的事情了。下面是PublicDnsName的一个示例。只需将其替换为专用ip字段

$ aws ec2 describe-instances --region us-east-1 --profile us-east-1 \
   | jq -r '.Reservations[0].Instances[0].PublicDnsName' >> myPublicDNS.txt


$ cat myPublicDNS.txt
ec2-54-226-5-78.compute-1.amazonaws.com
ec2-54-208-59-154.compute-1.amazonaws.com

sed
butchers窗口上的行尾。如果它是一个INI文件(如Windows INI文件),那么在通过
sed
运行后,您需要在其上运行
unix2dos.exe
。它不是Windows INI文件。这是一个ansible ini文件。不幸的是,im使用的机器没有安装jq。我可以安装它,但playbook将在其他没有jq的机器上运行。我可以在playbook中安装jq,但是机器应该作为isis保留。有没有办法让这个替换内联,比如说,如果我再次运行它,并想替换附加到inventory.ini文件中的最后一个IP:1:“2s/*/[[”]:替换模式内的未替换换行符-I''“2s/*/$(aws ec2描述实例--filters“Name=tag:Name,Values=ams*”“Name=instanc e-state-Name,Values=running”--查询“Reservations[].instances[][PrivateIpAddress]”)/“tester.txt双引号内不能有双引号。我将编辑我的答案以更好地解释这一点。