Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write this code into a one lined command

I have a curl command which return some json result.

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

I retreive the data actions with this command :

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

But I would like to use this code in python on the command line :

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

I tried this :

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

But it returns a syntax error

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
like image 610
executable Avatar asked Aug 04 '26 07:08

executable


2 Answers

you want to print this expression:

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

This filters the sub dictionary/ies where id == 1 and builds a list with the actions data.

so adapted to curl command line:

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

Feeding to a simple python command line works:

[['power', 'reboot']]

id seems unique, so maybe it's better to avoid returning a 1-element list:

next((i['actions'] for i in json.load(sys.stdin)['all'] if i['id'] == '1'),None)

with that expression it yields ['power', 'reboot'] or None if not found

like image 193
Jean-François Fabre Avatar answered Aug 05 '26 20:08

Jean-François Fabre


Give jq a try. It's a lightweight and flexible command-line JSON parser, and it's a standard package in Ubuntu (apt install jq) and Red Hat (yum install jq).

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

It plays nice with both JSON and standard UNIX tools. If you want to feed the output to regular tools use -r:

$ curl ... | jq -r '.all[] | select(.id=="1").actions[]' 
power
reboot
like image 34
John Kugelman Avatar answered Aug 05 '26 20:08

John Kugelman



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!