![](/img/trans.png)
[英]Problem parsing json from "aws ec2 describe-instances" output
[英]Parsing aws ec2 describe-instances to get all private ip addresses
我的兩個EC2實例每個都有3個IP。 我設法成功地獲取了JSON對象的列表:
aws ec2 describe-instances | jq '.Reservations[] | .Instances[] | (.Tags | { "iname": ( map ( select(.Value | contains("my-vm")))[] | .Value ) } ) + ( { "ip": ( .NetworkInterfaces[].PrivateIpAddress) } )' | jq -s .
給我以下結果:
[
{
"iname": "my-vm-b",
"ip": "10.11.2.145"
},
{
"iname": "my-vm-b",
"ip": "10.11.1.146"
},
{
"iname": "my-vm-b",
"ip": "10.11.10.144"
},
{
"iname": "my-vm-a",
"ip": "10.11.1.9"
},
{
"iname": "my-vm-a",
"ip": "10.11.10.125"
},
{
"iname": "my-vm-a",
"ip": "10.11.2.85"
}
]
然后將以下內容添加到命令中:
... | jq ' group_by(.iname)[] | {(.[0].iname): [.[] | .ip]}' | jq -s .
最終以我想要的方式獲取對象列表:
[
{
"my-vm-a": [
"10.11.1.9",
"10.11.10.125",
"10.11.2.85"
]
},
{
"my-vm-b": [
"10.11.2.145",
"10.11.1.146",
"10.11.10.144"
]
}
]
注意,我不得不給jq打電話了4次。 我知道我一定做錯了,所以我想知道是否可以通過一個jq調用來完成。
謝謝!
通過將表達式適當地包裝在方括號中,或者使用map
可能更好,可以輕松消除對jq -s
的調用。
例如,您的最后一對jq調用可以簡化為:
jq 'group_by(.iname) | map({(.[0].iname): [.[] | .ip]})'
下面應該使您可以將四個調用減少為一個:
[.Reservations[]
| .Instances[]
| (.Tags | { "iname": ( map ( select(.Value | contains("my-vm")))[] | .Value ) } )
+ ( { "ip": ( .NetworkInterfaces[].PrivateIpAddress) } ) ]
| group_by(.iname) | map({(.[0].iname): [.[] | .ip]})
但是,我建議不要在這里使用contains
,除非您完全了解其復雜性。
在您嘗試簡化jq調用之前,我認為先查看源數據及其與所需結果的關系會更有益。
忽略數據中的許多其他細節,我想我們可以同意您的數據看起來像這樣:
{
"Reservations": [
{
"Instances": [
{
"NetworkInterfaces": [
{ "PrivateIpAddress": "10.11.2.145" },
{ "PrivateIpAddress": "10.11.1.146" },
{ "PrivateIpAddress": "10.11.10.144" }
],
"Tags": [
{ "Key": "Name", "Value": "my-vm-b" }
]
},
{
"NetworkInterfaces": [
{ "PrivateIpAddress": "10.11.1.9" },
{ "PrivateIpAddress": "10.11.10.125" },
{ "PrivateIpAddress": "10.11.2.85" }
],
"Tags": [
{ "Key": "Name", "Value": "my-vm-a" }
]
}
]
}
]
}
使用如下所示的內容,您的jq查詢可以簡單地是:
[.Reservations[].Instances[] |
{
(.Tags|from_entries.Name): [.NetworkInterfaces[].PrivateIpAddress]
}
]
無需中間結果。 這里只是一些注意事項。
from_entries
將它們轉換為對象 "my-vm"
的標記值的存在來選擇實例。 我不確定您是否甚至需要執行此操作,我不知道您的數據是什么樣子,但是它們可能采用固定名稱,因此您應該使用該名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.