我正在使用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}'
但它返回整行。
答案 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")