正则表达式从字符串中获取三个数字并将其放入bash中的变量中

时间:2019-06-10 05:41:42

标签: regex bash curl

我正在使用curl从网站上获取json(无换行符)结果,现在我需要从整个字符串中提取两个数字。

curl -H "Accept:application/json" https://example.com -d ""

返回的结果是:

{"rows":[{"description":"Persistence: Maximum wait time (milliseconds)","name":"maxWaitTime","value":10000.0},{"description":"Persistence: Maximum number of items","name":"sizeThreshold","value":1000.0},{"description":"DB: Number of threads","name":"numberOfThreads","value":10.0}]}

我需要提取这3个数字并将其放入bash脚本的变量中。

从“描述”到“值”的每个数字之前的描述都是固定的。

万一发生超时并且卷曲返回错误28,应将“ -1”分配给变量。

我尝试了以下方法:

awk '/"name":"numberOfThreads","value":(.*)},/{print $0}'

但它返回整行。

1 个答案:

答案 0 :(得分:2)

您的JSON缺少{objects}中最后两个[array]之间的逗号。了解到cURL输出无效的json会让我感到非常惊讶,但是我将向您展示如何使用jq从此数据结构中检索值:

注意:jq不管结构紧凑(您的示例)还是精美印刷(下面)都可以使用

{
  "rows": [
    {
      "description": "Persistence: Maximum wait time (milliseconds)",
      "name": "maxWaitTime",
      "value": 10000
    },
    {
      "description": "Persistence: Maximum number of items",
      "name": "sizeThreshold",
      "value": 1000
    },
    {
      "description": "DB: Number of threads",
      "name": "numberOfThreads",
      "value": 10
    }
  ]
}

我们要过滤数组rows中的所有对象,因此我们将首先按名称剥离数组,然后按键检索“值”:

$ jq '.rows[].value' file
10000
1000
10

现在您可以在while循环中遍历这些结果,但是明智的做法是使用Bash 4的mapfile和过程替换<()来创建Bash数组:

$ mapfile -t Array < <(jq '.rows[].value' file)
$ declare -p Array
declare -a Array=([0]="10000" [1]="1000" [2]="10")