使用grep在输出中构造字符串

Ily*_*nyy 2 bash shell 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\"}  })"
Run Code Online (Sandbox Code Playgroud)

我得到的输出看起来像这样:

{
"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"
} ]
Run Code Online (Sandbox Code Playgroud)

我在上面的命令中添加了一个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 '",'
Run Code Online (Sandbox Code Playgroud)

我得到一个输出

66
67
Run Code Online (Sandbox Code Playgroud)

所以我可以通过命令从这些字符串中创建一个数组:

($(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 '",'))
Run Code Online (Sandbox Code Playgroud)

但我真正需要的是获得一个像路径/名称一样的字符串数组.

所以应该是我的情况

App_7.1.2/66
App_7.1.2/67
Run Code Online (Sandbox Code Playgroud)

你能告诉我,我该怎么办?我需要使用grep从输出中加入不同的字符串,这可能吗?提前致谢

Emi*_*röm 5

在Bash中使用JSON时,我建议您通过jq管道.我认为grep是这项工作的错误工具.此命令为您提供所需内容:

curl https://example.com/ | jq --raw-output '.results | .[] | .path + "/" + .name'
Run Code Online (Sandbox Code Playgroud)

jq过滤器意味着:

  • .results - 阅读JSON对象的"results"属性
  • .[] - 逐个读取数组中的每个元素
  • .path + "/" + .name - 连接每个对象的"path"属性,"/"字符串和"name"属性

然后我们添加--raw-output标志以将结果输出为行而不是JSON.