Извлеките строку из 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, которое изменяет возвращаемые значения).
Шаблон
(?:\G(?!^)",|"groups":\s*\[)
- либо конец предыдущего матча (\G(?!^)
) а потом",
подстрока или (|
) буквальный текст"groups":
, 0+ пробелов (\s*
) и[
символ (\[
)\s*"
- 0+ пробелов и"
голец\K
- оператор сброса совпадений, отбрасывающий весь найденный текст[^"]+
- 1+ символов кроме"
Как видите, это выражение находит "group": ["
, пропускает этот текст и соответствует каждому значению внутри "
только после этого текста.
Смотрите демонстрацию PCRE регулярных выражений.