2016-02-13 50 views
0

我想在一個循環中運行一個jq過濾器,並從另一個文件中的列表中獲取匹配的鍵值。使用eval來執行jq

while read line 
do 
    jqfilter="jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"}, {Value: "$line"}]}))' describe-instances.json" 
    eval "$jqfilter"; 
done < "./list" 

該循環正在工作,$line正在被替換爲適當的值。

問題出在{Key: "Name"},eval去掉NAME周圍的引號,結果jq過濾器不起作用。

+1

爲什麼使用eval工作?你爲什麼不直接調用jq?請注意它在問題中是如何着色的,你試圖將雙引號放在雙引號字符串中,它應該被轉義。 –

+0

轉義報價做了伎倆,謝謝。 – ubr

回答

2

正如Jeff指出的那樣,如果可能的話,儘可能使用jq做所有事情是明智的,但即使無法避免循環,eval絕對可以也可能應該是效率和避免併發症。

例如,我懷疑你可以簡單的寫:

jq --arg line "$line" ' 
    .Reservations[].Instances[] 
    | select(contains({Tags: [{Key: "Name"}, {Value: $line}]})) 
' describe-instances.json 
0

謝謝高峯,幾個小編輯和您的建議擺在首位完美

while read line do jq --arg line "$line" '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"}, {Value: "line"}]}))' describe-instances.json; done < "./instances-names"

+0

(1)'describe-instances.json'中有多少個頂級實體?如果只有一個,那麼你可以消除'while'循環。 (2)您顯示的jq過濾器不包含$行,因此不正確。 – peak