我有一个JSON输入:
{
"policyItems": [
{
"accesses": [
{
"type": "submit-app",
"isAllowed": true
}
],
"users": [],
"groups": [
"Application_Team_1",
"team2"
],
"conditions": [],
"delegateAdmin": false
}
]
}
我进行了命令行卷曲以显示队列策略纱:
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
来做到这一点?
答案 0 :(得分:1)
您可以使用
grep -Poza '(?:\G(?!^)",|"groups":\s*\[)\s*"\K[^"]+'
选项
P
-使用PCRE引擎解析模式o
-找到输出匹配项z
-抓取整个文件,将文件视为单个字符串a
-将文件视为文本文件(should be used,因为-z
开关可能触发grep 二进制数据行为,从而改变返回值)。模式
(?:\G(?!^)",|"groups":\s*\[)
-end of the previous match(\G(?!^)
)然后是",
子字符串,或(|
)文字文本"groups":
,0 +空格(\s*
)和[
字符(\[
)\s*"
-0 +空格和"
字符\K
-match reset operator丢弃到目前为止匹配的整个文本[^"]+
-除"
以外的1个以上的字符如您所见,该表达式找到"group": ["
,省略了该文本,并且仅在该文本之后匹配"
内的每个值。
请参见PCRE regex demo。