2017-07-28 63 views
0
{ 
    "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對象。嘗試在數組中獲得兩個狀態變量,即運行和待機狀態。到目前爲止,我已經試過解析json到bash中的數組

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

沒有在服務器中安裝包jq或python。 – linus2303

+0

您可以編輯問題中的詳細信息,無需將其添加到評論中,並且您的代碼也不會縮進,請正確縮進 –

回答

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寫的

1

僅當您使用awk時,您不需要包含20個不同命令的管道。您提供的命令行可以寫成只有一個命令:

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

,但你真正需要的是:

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

,並保存在一個殼陣列的輸出(假設你的JSON是真的總是格式化爲你展示你的問題)是:

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

替換cat filecurl命令。