如何使用bash从json中检索“name”值?

时间:2016-06-14 22:26:33

标签: bash curl grep sh jq

我使用以下curl命令:

curl -s  -v --user admin:orca --insecure -X GET https://insecure.registry.com/api/v0/repositories/authi-api/tags  

获得以下输出:

   {
    "name": "Dev_ReleaseRollout_Lane-3",
    "inRegistry": true,
    "hashMismatch": false,
    "inNotary": false
   },
   {
    "name": "Dev_ReleaseRollout_Lane-latest",
    "inRegistry": true,
    "hashMismatch": false,
    "inNotary": false
   },
   {
    "name": "Payments_Dev_Lane-267",
    "inRegistry": true,
    "hashMismatch": false,
    "inNotary": false
   }

我想在变量中只获得name个值 我只需要变量

中的Dev_ReleaseRollout_Lane-3 Dev_ReleaseRollout_Lane-latest Payments_Dev_Lane-267

1 个答案:

答案 0 :(得分:1)

假设你实际上有三个对象的数组:

$ curl ... | jq -r '.[].name'
Dev_ReleaseRollout_Lane-3
Dev_ReleaseRollout_Lane-latest
Payments_Dev_Lane-267

这很简单,.是数组,[].name取名数中每个元素的名称。 -r是原始输出。

  

--raw-output / -r:
  使用此选项,如果过滤器的结果是字符串,则它将直接写入标准输出,而不是格式化为带引号的JSON字符串。这对于使jq过滤器与非基于JSON的系统进行通信非常有用。

如果cURL输出实际上如上所述,则以下内容将起作用:

jq -rRs '"[\(.)]" | fromjson[].name' file.json

但是我认为有一种更好的方法来围绕输入包装数组,

-R是原始输入,-s是傻瓜。 \(...)string interpolation

  

--slurp/-s:
  不是为输入中的每个JSON对象运行过滤器,而是将整个输入流读入一个大型数组并仅运行一次过滤器。