使用grep从JSON提取字符串

时间:2018-06-21 12:46:42

标签: regex shell grep rjson

我有一个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来做到这一点?

1 个答案:

答案 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