如何通过cURL命令中的特定ID从JSON获取值

时间:2019-02-06 14:15:30

标签: python bash shell curl

我的cURL命令向我返回一些json数据,如下所示:

{  
    "all":[  
        {
            "id":"1",
            "actions":[  
                "power",
                "reboot"
            ]
        },
        {
            "id":"2",
            "actions":[  
                "shutdown"
            ]
        },
        {
            "id":"3",
            "actions":[  
                "backup"
            ]
        }
    ]
} 

仅知道id,如何将actions的值返回到变量中?我知道如何解析ID,但如何获取actions

这是cURL命令:

#!/bin/bash
IDS=$(curl https://DOMAIN/API -H "X-Auth-Token: $TOKEN" | python -c "import sys, json; print [i['id'] for i in json.load(sys.stdin)['all']]")

$IDS将输出json中的所有IDS。


示例: 如果我搜索id = 1,我将返回["power", "reboot"]


我还可以使用:

#!/bin/bash
ACTIONS=$(curl -s https://DOMAIN/API -H "X-Auth-Token: TOKEN" | python -c "import sys, json, re; print [ i['allowed_actions'] for i in json.load(sys.stdin)['servers']]")

我想做这样的事情:

#!/bin/bash
ACTIONS=$(curl -s https://DOMAIN/API -H "X-Auth-Token: TOKEN" | python -c "import sys, json, re; print [ if i['id'] == '1': i['allowed_actions'] for i in json.load(sys.stdin)['servers']]")

但是我有语法错误。

如何将该代码转换为单个命令行代码?

for i in json.load(sys.stdin)['all']:
    if i['id'] == '1':
        print(i['actions'])

2 个答案:

答案 0 :(得分:1)

通常情况下,规范是不要在python中使用exec,但是由于您想排成一行,所以您可以选择

cat temp | python -c "exec(\"import sys,json \nfor i in json.load(sys.stdin)['all']:\n    if i['id'] == '1':\n        print(i['actions'])\")"

在说这句话的同时,我建议您仅创建另一个python文件,然后由该文件完成此工作,希望对您有所帮助:)

答案 1 :(得分:1)

CLI中,您可以使用jq;

curl -s "http://api.icndb.com/jokes/random" | jq '.value.joke'

在您的情况下,可能类似于(未经测试):

ACTIONS=$(curl -s "https://DOMAIN/API" | jq '.all.actions')

jq的更多信息/示例;

https://medium.com/cameron-nokes/working-with-json-in-bash-using-jq-13d76d307c4