2017-07-11 39 views
0

循環我有一個JSON文件,該文件是這樣的:我如何通過我的JSON使用bash

{ 
    "version": { 
    "Generated": "@logon", 
    "Value": "Unknown", 
    "LastRun": "Never" 
    }, 
    "hostname": { 
    "Generated": "@logon", 
    "Value": "Unknown", 
    "LastRun": "Never" 
    }, 
    "updates": { 
    "Generated": "@boot", 
    "Value": "Unknown", 
    "LastRun": "Never" 
    } 
} 

我怎樣才能通過猛砸其中有作爲「生成的」價值「在JSON文件中的每個元素循環@logon「?我想我應該使用jq,但我沒有設法找到合適的過濾器。

+0

嘿,我認爲[這個答案](https://stackoverflow.com/a/38122029/7111561)應該是你需要的 – derHugo

回答

2

您的意思是?

jq -r '.[].Generated' file.json ; while read -r val ; do 
    do_something "${val}" 
done 
+1

我想他也想區分'@ logon'和'@ boot'值,所以一個額外的比較就足夠了。 –

+0

你看起來是對的。我在等待澄清什麼'jq'應該打印。 – hek2mgl

2

如果你想通過滿足該條件的JSON對象使用bash循環,考慮:

while read -r val ; do 
    echo "${val}" 
done < <(jq -rc '.[] | select(.Generated == "@logon")' file.json) 

輸出:

{"Generated":"@logon","Value":"Unknown","LastRun":"Never"} 
{"Generated":"@logon","Value":"Unknown","LastRun":"Never"} 

需要-c選項,如果這種方法在bash中循環被採用。

當然,最好在jq內儘可能多地處理JSON對象。

如果要循環訪問頂級鍵值對,則可能需要使用to_entries或者with_entries。例如,要使用.Generated ==「@logon」打印對象的鍵:

$ jq -r 'to_entries[] | select(.value.Generated == "@logon") | .key' input.json 
version 
hostname 

注意 - 不需要bash循環!