Поиск подстроки из атрибута JSON с помощью jq - PullRequest
0 голосов
/ 17 октября 2019

Я знаю, как получить весь атрибут JSON с помощью jq, но я хочу извлечь только определенную подстроку. Рассмотрим следующий пример ввода:

[
  {
    "name": "test",
    "output": "",
    "error": "",
    "state": "unknown",
    "startTime": 1571292623936,
    "endTime": 0,
    "extra": {},
    "warning": "************************* test Warnings *************************\n*\n* \n*****************************************************************",
    "hasWarning": false
  },
  {
    "name": "npm run test",
    "output": "\n> DISPLAY was set to: \":99\"\n\nCypress will attempt to fix the problem and rerun.\n\n\n            Running: consumer/oct.js...                                          (1 of 1) \nPROCESSING JS RESOURCE FILE   FROM:/PMT1469/workspace/E2EI/cypress/e2e/consumer/kindle.js\n{\"dataFile\":\"scripts/regression/transfers/card/kindle.csv\"}\nSENDING JS RESOURCE FILE FROM: /PMT-1469/workspace/E2E-UI { startedTestsAt: '2019-10-17T06:10:59.339Z',\n  endedTestsAt: '2019-10-17T06:11:53.542Z',\n totalDuration: 54203,\n  totalSuites: 4,\n  totalTests: 2,\n  totalFailed: 2,\n  totalPassed: 0,\n  totalPending: 0,\n  totalSkipped: 0,\n\n  browserPath: '',\n  browserName: 'electron',\n reporter: 'mochawesome',\n         taskTimeout: 60000,\n     video: true,\n      known: true }\n",
    "error": null,
    "state": "success",
    "startTime": 1571292631223,
    "endTime": 1571292718780,
    "extra": {},
    "warning": "************************* npm run test Warnings *************************\n*\n* \n*************************************************************************",
    "hasWarning": false
  }
]

Я просто хочу выбрать следующие значения в вышеуказанной полезной нагрузке JSON, которая находится в атрибуте «output».

Ожидаемый результат:

totalDuration: 54203
totalSuites: 4
totalFailed: 2
totalPassed: 0
totalSkipped: 0

Мы можем легко получить значения атрибутов, используя jq -r '.[].output', но я пытаюсь захватить только подстроки вида total<something>: <number>.

1 Ответ

2 голосов
/ 17 октября 2019

Неэффективный, но простой ответ - выполнить основную часть работы на отдельной стадии конвейера. Предполагая, что инструменты GNU:

jq -r '.[].output' <in.json \
  | grep -Eo '^[[:space:]]+(total[[:alpha:]]+: [[:digit:]]+)' \
  | sed -re 's/^[[:space:]]+//'

Однако, с современными jq, можно сделать намного лучше:

jq -r '.[].output | scan("total[[:alpha:]]+: [[:digit:]]+")' <in.json
...