Выражение регулярных выражений с помощью инструмента JQ - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть файл json, в котором я использую инструмент JQ, чтобы извлечь из него несколько строк.Однако теперь мне нужно получить некоторую информацию из этой строки с помощью регулярных выражений.Я застрял на две части.Во-первых, я не могу понять регулярное выражение для получения нужных мне строк, а во-вторых, я знаю, каков правильный синтаксис для применения регулярного выражения вместе с JQ Tool.Я пробовал следующий синтаксис и получаю сообщение об ошибке «неопределенное регулярное выражение»

jq '.msg.stdout_lines[2]' /tmp/vaultKeys.json | awk '{gsub(/\:(.*[\a-zA-Z0-9]))}1'

Мой файл json выглядит следующим образом:

{
"msg": {
"changed": true,
"cmd": [
  "vault",
  "operator",
  "init"
],
"delta": "0:00:00.568974",
"end": "2018-11-29 15:42:00.243019",
"failed": false,
"rc": 0,
"start": "2018-11-29 15:41:59.674045",
"stderr": "",
"stderr_lines": [],
"stdout": "Unseal Key 1: ZA0Gas2GrHtdMlet1g63N6gvEPYf5mzZEfjPhMDRyAeS\nUnseal Key 2: NY+CLIbgMJIv+e81FuB1OpV0m7rPuqZbIuYT142MrQLl\nUnseal Key 3: HNWmsrXBsSV9JFuGfqpd+GvPYQzHEsLFlxKBfEyBhCZ6\nUnseal Key 4: xDwfI+kFHFRSzq2JyxSGArQsGjCrFiNbkGCP897Zfbuz\nUnseal Key 5: +O8/tTmDNSzaUBMT8QP+2xbvu5uulypf3+xmWzY8fSD3\n\nInitial Root Token: 6kO8ijZzyhcG5Nup5QUca0u3\n\nVault initialized with 5 key shares and a key threshold of 3. Please securely\ndistribute the key shares printed above. When the Vault is re-sealed,\nrestarted, or stopped, you must supply at least 3 of these keys to unseal it\nbefore it can start servicing requests.\n\nVault does not store the generated master key. Without at least 3 key to\nreconstruct the master key, Vault will remain permanently sealed!\n\nIt is possible to generate new unseal keys, provided you have a quorum of\nexisting unseal keys shares. See \"vault operator rekey\" for more information.",
"stdout_lines": [
  "Unseal Key 1: ZA0Gas2GrHtdMlet1g63N6gvEPYf5mzZEfjPhMDRyAeS",
  "Unseal Key 2: NY+CLIbgMJIv+e81FuB1OpV0m7rPuqZbIuYT142MrQLl",
  "Unseal Key 3: HNWmsrXBsSV9JFuGfqpd+GvPYQzHEsLFlxKBfEyBhCZ6",
  "Unseal Key 4: xDwfI+kFHFRSzq2JyxSGArQsGjCrFiNbkGCP897Zfbuz",
  "Unseal Key 5: +O8/tTmDNSzaUBMT8QP+2xbvu5uulypf3+xmWzY8fSD3",
  "",
  "Initial Root Token: 6kO8ijZzyhcG5Nup5QUca0u3",
  "",
  "Vault initialized with 5 key shares and a key threshold of 3. Please securely",
  "distribute the key shares printed above. When the Vault is re-sealed,",
  "restarted, or stopped, you must supply at least 3 of these keys to unseal it",
  "before it can start servicing requests.",
  "",
  "Vault does not store the generated master key. Without at least 3 key to",
  "reconstruct the master key, Vault will remain permanently sealed!",
  "",
  "It is possible to generate new unseal keys, provided you have a quorum of",
  "existing unseal keys shares. See \"vault operator rekey\" for more information."
 ]
}
}

Вне строки

"Unseal Key 3: HNWmsrXBsSV9JFuGfqpd+GvPYQzHEsLFlxKBfEyBhCZ6"

Я хотел бы просто

HNWmsrXBsSV9JFuGfqpd+GvPYQzHEsLFlxKBfEyBhCZ6

В настоящее время, используя мое регулярное выражение, я получаю, только если я использую его без синтаксиса инструмента JQ

: ZA0Gas2GrHtdMlet1g63N6gvEPYf5mzZEfjPhMDRyAeS

Итак, для подведения итогов мне нужна помощь с

a) получение правильного регулярного выражения и

b) правильный синтаксис для использования выражения с JQ Tool.

Спасибо

Ответы [ 4 ]

0 голосов
/ 30 ноября 2018

Для этого конкретного случая вы можете использовать split вместо регулярного выражения.

jq -r '.msg.stdout_lines[2]|split(" ")[-1]' file
0 голосов
/ 29 ноября 2018

В интересах универсальных покупок вы можете, например, использовать этот вызов:

jq -r '.msg.stdout_lines[2]
       | capture(": (?<s>.*)").s'

Конечно, есть много других возможностей, в зависимости от ваших точных требований.

0 голосов
/ 29 ноября 2018

Есть много способов, кроме очевидного | grep -Po '(?<=: ).+\b', вы даже можете использовать substr с awk, если длина строки фиксирована:

jq .. | awk '{print substr($1, RSTART+14)}'
0 голосов
/ 29 ноября 2018

У вас есть GNU grep?

jq -r '.msg.stdout_lines[2]' /tmp/vaultKeys.json | grep -Po '(?<=: ).+'
...