2016-12-02 67 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