如何将此代码写入一行命令

时间:2019-02-06 15:17:24

标签: python json python-2.7 shell

我有一个curl命令,它返回一些json结果。

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

我使用以下命令检索数据操作:

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']]"

但是我想在命令行的python中使用此代码:

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

我尝试过这个:

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

但是它返回语法错误

File "<string>", line 1
    import sys, json, re; for i in json.load(sys.stdin)['all']:\nif i['id'] == '1':\nprint(i['actions'])
                            ^
SyntaxError: invalid syntax

2 个答案:

答案 0 :(得分:6)

您要打印此表达式:

  list = [{ "name": "own", id: "own"},{ "name": "competitor", id: "competitor"}];

  selectedRadio =this.list[0].id;

这将过滤[i['actions'] for i in json.load(sys.stdin)['all'] if i['id'] == '1'] 所在的子词典,并使用id == 1数据构建一个列表。

因此适用于curl命令行:

actions

使用简单的python命令行即可:

curl -s https://DOMAIN/API -H "X-Auth-Token: TOKEN" | python -c "import sys, json, re; print([i['actions'] for i in json.load(sys.stdin)['all'] if i['id'] == '1'])"

id似乎是唯一的,所以最好避免返回包含1个元素的列表:

[['power', 'reboot']]

使用该表达式将产生next((i['actions'] for i in json.load(sys.stdin)['all'] if i['id'] == '1'),None) ['power', 'reboot'](如果找不到)

答案 1 :(得分:3)

尝试jq。这是一个轻巧灵活的命令行JSON解析器,并且是Ubuntu(apt install jq)和Red Hat(yum install jq)中的标准软件包。

$ curl ... | jq -c '.all[] | select(.id=="1").actions' 
["power","reboot"]

它可以与JSON和标准UNIX工具一起使用。如果要将输出提供给常规工具,请使用-r

$ curl ... | jq -r '.all[] | select(.id=="1").actions[]' 
power
reboot