регулярное выражение, чтобы получить три числа из строки и положить их в переменную в Bash - PullRequest
0 голосов
/ 10 июня 2019

Я использую 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.

Описание перед каждым числом, начиная с«описание» к «значению», исправлены.

в случае тайм-аута и ошибки возврата curl 28, переменным должно быть присвоено «-1».

Я пробовал подход, подобный следующему:

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

, но он возвращаетвся строка.

1 Ответ

2 голосов
/ 10 июня 2019

В вашем 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, но разумным шагом будет использование mapfile Bash 4 и подстановка процесса <() для создания массива Bash:

$ mapfile -t Array < <(jq '.rows[].value' file)
$ declare -p Array
declare -a Array=([0]="10000" [1]="1000" [2]="10")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...