Извлеките строку из JSON, используя grep

У меня есть вход JSON:

{
  "policyItems": [
    {
      "accesses": [
        {
          "type": "submit-app",
          "isAllowed": true
        }
      ],
      "users": [],
      "groups": [
        "Application_Team_1",
        "team2"
      ],
      "conditions": [],
      "delegateAdmin": false
    }
  ]
}

Я сделал curl командной строки для отображения пряжи политики очереди:

curl  -u "login:password" http://myHost:6080/service/public/v2/api/service/YARN_Cluster/policy/YARN%20NameQueue/

Работает нормально.

Потом я добавил grep чтобы извлечь весь список элементов групп:

curl  -u "login:password" http://myHost:6080/service/public/v2/api/service/YARN_Cluster/policy/YARN%20NameQueue/ | 
grep -oP '(?<="groups": ")[^"]*'

Это следующее является результатом:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   579    0   579    0     0   4384      0 --:--:-- --:--:-- --:--:--  4419

Это не работает. Как я могу сделать это с помощью grep и не jq?

1 ответ

Решение

Вы можете использовать

grep -Poza '(?:\G(?!^)",|"groups":\s*\[)\s*"\K[^"]+'

Опции

  • P - использовать движок PCRE для разбора шаблона
  • o - найдены выходные совпадения
  • z - хлебать весь файл, обрабатывать файл как единую строку
  • a - обрабатывать файл как текстовый файл (его следует использовать, потому что когда -z switch может запускать поведение двоичных данных grep, которое изменяет возвращаемые значения).

Шаблон

Как видите, это выражение находит "group": [", пропускает этот текст и соответствует каждому значению внутри "только после этого текста.

Смотрите демонстрацию PCRE регулярных выражений.

Другие вопросы по тегам