2016-12-02 66 views
2

我正在嘗試使用JQ命令篩選JSON對象以選擇性地提取密鑰。下面是我放在文件x.txt一個樣本對象:JQ:篩選密鑰

{ 
    "activities" : { 
     "-KSndgjqvmQkWVKHCpLh" : { 
     "create_device" : "...", 
     "stop_time_utc" : "2016-11-01T23:08:08Z" 
    }, 
     "-KSoBSrBh6PZcjRocGD7" : { 
     "create_device" : "..." 
    }, 
     "-KSptboGjo8g4bieUbGM" : { 
     "create_device" : "...", 
     "stop_time_utc" : "2017-01-17T23:08:08Z" 
    } 
    } 
} 

以下命令可以提取所有活動鍵:

cat x.txt | jq '.activities | keys' 
[ 
    "-KSndgjqvmQkWVKHCpLh", 
    "-KSoBSrBh6PZcjRocGD7", 
    "-KSptboGjo8g4bieUbGM" 
] 

我一直在谷歌上搜索並嘗試了几几小時嘗試過濾對象以僅選擇具有stop_time_utc值的活動條目,並使用類似於「select(.stop_time_utc | fromdateiso8601> now)」的選項來僅挑選已過期的活動。例如,我想使用過濾器只用一個相關條目的採樣對象創建磁盤陣列:

[ 
    "-KSndgjqvmQkWVKHCpLh" 
] 

與鍵選擇了錯誤的路線嘗試呢?任何想法或建議將不勝感激。

感謝

回答

2

with_entries/1是你的朋友,如:

.activities | with_entries(select(.value | has("stop_time_utc"))) 

生產:

{ 
    "-KSndgjqvmQkWVKHCpLh": { 
    "create_device": "...", 
    "stop_time_utc": "2016-11-01T23:08:08Z" 
    }, 
    "-KSptboGjo8g4bieUbGM": { 
    "create_device": "...", 
    "stop_time_utc": "2017-01-17T23:08:08Z" 
    } 

它現在很容易增加額外的選擇標準,提取所關注的關鍵姓名等例如:

.activities 
| with_entries(select((.value.stop_time_utc? | fromdateiso8601?) < now)) 
| keys 
+0

感謝@peak指向with_entries的指針!以下是我現在用來提取過期活動名稱的完整命令: jq'.activities | with_entries(select(.value | has(「stop_time_utc」)))| with_entries(select(.value.stop_time_utc | fromdateiso8601? DThimsen