在bash中将json解析为数组

时间:2017-07-28 03:13:19

标签: json linux bash awk sed

{
    "db_status": {
        "sysa": {
            "taskname": "AB",
            "state": "Running",
            "status": "System ATTENTION",
            "updated": "0727",
            "version": "5"
        },

        "sysb": {
            "taskname": "null",
            "state": "Standby",
            "status": "System OK",
            "updated": "0727",
            "version": "6"
        }
    }
}

CURL命令返回json对象。试图在数组中获取两个状态变量,即运行和待机。到目前为止我已经尝试了

curl -s http://localhost:9099/api | grep state | sed 's/"//g' | awk -F  ": " '/state/ {print $2}' | tr '\n' ' ' |  sed s'/..$//'

2 个答案:

答案 0 :(得分:2)

当你使用awk时,你不需要20个不同命令的管道。您提供的命令行只能写为一个命令:

awk -F'"' '$2=="state"{printf "%s%s", (++c>1?", ":""),$4}'

但你真正需要的是:

awk -F'"' '$2=="state"{print $4}'

并将输出保存在shell数组中(假设您的json实际上始终按照您在问题中显示的格式化)将是:

$ arr=( $(cat file | awk -F'"' '$2=="state"{print $4}') )
$ echo "${arr[0]}"
Running
$ echo "${arr[1]}"
Standby

cat file替换为curl命令。

答案 1 :(得分:1)

您可以使用jq

$ curl -s http://localhost:9099/api | jq '.db_status.sysa.state, .db_status.sysb.state'
"Running"
"Standby"

或者如果您想要所有条目,无论多少

$ curl -s http://localhost:9099/api | jq '.db_status[].state'
"Running"
"Standby"

或者,如果你没有jq(或只是寻找感觉疼痛的方法),你可以使用ticktick解析bash中的大多数json - 这是用250行bash编写的< / p>