2016-10-06 56 views
0

我已經接到了描述,實例如下:如何從EC2提取特定鍵值廣告代碼描述,實例

{ 
    "Reservations": [ 
     { 
      "Instances": [ 
       { 
        PublicDnsName": "ec2-xxxxx.amazonaws.com", 
        "Tags": [ 
         { 
          "Value": "yyyyy", 
          "Key": "Name" 
         }, 
         { 
          "Value": "zzzzz", 
          "Key": "budget_cluster" 
         }, 
         { 
          "Value": "aaaaaaa", 
          "Key": "poc" 
         }, 

對於每個實例,我想提取PublicDnsName和價值「budget_cluster」標籤密鑰。如何用ec2 describe-instancesjq做到這一點?

+0

您提供的樣本JSON是不完整的。請修改您的帖子,以包含一個足以達到目的的最低限度的有效JSON。 – peak

+0

對。這不是有效的json。但是它包含了足夠的信息給瞭解知道ec2和jq提供可行解決方案的人。 –

回答

3

修改弗雷德裏克的回答是:

aws ec2 describe-instances --output text --query \ 
    'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]' 

將產生:

ec2-xxxxx.amazonaws.com zzzzz 
ec2-bbbbb.amazonaws.com yyyyy 

我已經改變了輸出的文本,它去除了儘可能多的格式儘可能與| [0]選擇的個人標籤值,因爲那裏不僅會無論如何,每一次都是一次。最後,我在最後刪除了[],以便生成的列表不會變平。這樣在文本輸出中,每個條目都將在自己的行上。

您也可以通過僅選擇實際上具有標籤情況下,這更穩健。你可以進一步修改到--query參數這樣做,但在這種情況下使用--filters參數,因爲它的服務端篩選更好。特別是你想要的tag-key過濾器:--filters "Name=tag-key,Values=budget_cluster"

aws ec2 describe-instances --output text \ 
    --filters "Name=tag-key,Values=budget_cluster" --query \ 
    'Reservations[].Instances[?Tags[?Key==`budget_cluster`]].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]' 

仍然會產生:

ec2-xxxxx.amazonaws.com zzzzz 
ec2-bbbbb.amazonaws.com yyyyy 

但在電線你只會越來越您所關心的實例,從而節省資金上的帶寬。

+0

這工作,謝謝。 –

0

使用JQ 1.5或更高版本(1.5是最新的官方發佈版本),最簡單的方法是使用from_entries

說明性輸入的最小修復程序後,下面的調用:

$ jq '.Reservations[] 
     | .Instances[] 
     | [.PublicDnsName, (.Tags|from_entries|.budget_cluster)]' input.json 

生產:

[ 
    "ec2-xxxxx.amazonaws.com", 
    "zzzzz" 
] 

如果你沒有JQ 1.5或更高版本,下面應該工作:

$ jq1.4 '.Reservations[] 
| .Instances[] 
| [.PublicDnsName, (.Tags[]|select(.Key=="budget_cluster") | .Value)]' input.json 
+0

這也不是我的快速和無心的修改它的工作。它們產生:'jq:error:不能使用null作爲對象鍵 jq:錯誤:不能使用null作爲對象鍵' –

+0

給出的解決方案假設你有jq 1.5或更高版本(1.5是最新的正式版本)。查看發佈更新。 – peak

+0

你的jq1.4解決方案的工作原理是把它放到一個數組中(每個對聯都被方括號所包含)。 –

0

@peak的答案是偉大的,我一直從他的學習一部分,但你可以再次從AWS CLI

aws ec2 describe-instances --query \ 
    'Reservations[].Instances[].{PublicDnsName:PublicDnsName, Budget:Tags[?Key==`budget_cluster`].Value}' 

達到了相當多會產生

[ 
    { 
     "PublicDnsName": "ec2-xxxxx.amazonaws.com", 
     "Budget": [ 
       "zzzz", 
     ] 
    } 
] 

如果你不想做一個新的嚴格的JSON出來的,只取值

aws ec2 describe-instances --query \ 
    'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value][]' 

會產生

[ 
    "ec2-xxxxx.amazonaws.com", 
    [ 
     "zzzz" 
    ] 
] 
+0

這就像你說的那樣工作。但我正在尋找的是隻提取PublicDNSName和預算鍵的值,沒有任何其他文本。 –

+0

添加沒有JSon鍵的例子,這只是返回一個數組,然後不是JSon –

+0

感謝您的更新,但我正在尋找的只是一個簡單的:''「ec2 ..」「zzz」' –