2017-04-24 89 views
2

我有一個curl命令構建字符串使用grep的

curl -u user:password -X POST -k http://artifactory:8081/artifactory/api/search/aql -d "items.find({\"type\" : \"folder\", \"repo\" : \"test-repo\", \"path\" : \""App_7.1.2"\", \"modified\" : {\"\$lt\" : \"2017-05-18\"} })" 

的輸出,我得到這個樣子的:

{ 
"results" : [ { 
    "repo" : "test-repo", 
    "path" : "App_7.1.2", 
    "name" : "66", 
    "type" : "folder", 
    "size" : 0, 
    "created" : "2016-05-26T09:40:03.332+03:00", 
    "created_by" : "user", 
    "modified" : "2016-05-26T09:40:03.332+03:00", 
    "modified_by" : "user", 
    "updated" : "2016-05-26T09:40:03.332+03:00" 
},{ 
    "repo" : "test-repo", 
    "path" : "App_7.1.2", 
    "name" : "67", 
    "type" : "folder", 
    "size" : 0, 
    "created" : "2016-05-31T19:19:35.040+03:00", 
    "created_by" : "user", 
    "modified" : "2016-05-31T19:19:35.040+03:00", 
    "modified_by" : "user", 
    "updated" : "2016-05-31T19:19:35.040+03:00" 
} ] 

我添加grep命令上述命令,並它開始看起來像

curl -u user:password -X POST -k http://artifactory:8081/artifactory/api/search/aql -d "items.find({\"type\" : \"folder\", \"repo\" : \"test-repo\", \"path\" : \""App_7.1.2"\", \"modified\" : {\"\$lt\" : \"2017-05-18\"} })" | grep -oP '\"name\" : \K.*' |tr -d '",' 

,我得到一個輸出

66 
67 

這樣我就可以通過命令做出這些字符串數組:

($(curl -u user:password -X POST -k http://artifactory:8081/artifactory/api/search/aql -d "items.find({\"type\" : \"folder\", \"repo\" : \"test-repo\", \"path\" : \""App_7.1.2"\", \"modified\" : {\"\$lt\" : \"2017-05-18\"} })" | grep -oP '\"name\" : \K.*' |tr -d '",')) 

但我真正需要的 - 是讓像路徑/名字符串數組。

所以應該在我的情況

App_7.1.2/66 
App_7.1.2/67 

你能告訴我,我該怎麼辦呢?我需要通過使用grep從輸出中加入不同的字符串,這可能嗎?在此先感謝

回答

5

當在Bash中使用JSON時,我建議你通過jq管道。我認爲grep是這項工作的錯誤工具。此命令給你想要的東西:

curl https://example.com/ | jq --raw-output '.results | .[] | .path + "/" + .name' 

的JQ過濾器是指:

  • .results - 閱讀您的JSON對象的 「結果」 屬性
  • .[] - 閱讀每個元素的數組中,逐個連接
  • .path + "/" + .name - 連接每個對象的「路徑」屬性,「/」字符串和「名稱」屬性

然後我們添加--raw-output標誌來輸出結果,而不是JSON。