2

我有一个 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呢?

4

1 回答 1

1

您可以使用

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

选项

  • P- 使用 PCRE 引擎解析模式
  • o- 找到的输出匹配
  • z- slurp 整个文件,将文件视为一个完整的单个字符串
  • a- 将文件视为文本文件(应该使用它,因为当-z开关可能触发更改返回值的 grep二进制数据行为时)。

图案

  • (?:\G(?!^)",|"groups":\s*\[)-前一个匹配的结尾( \G(?!^)) 然后是",子字符串,或者 ( |) 文字文本"groups":、0+ 空格 ( \s*) 和[字符 ( \[)
  • \s*"- 0+ 空格和"字符
  • \K-匹配重置运算符丢弃到目前为止匹配的整个文本
  • [^"]+- 1+ 字符以外"

如您所见,此表达式查找"group": ["、省略该文本并"仅匹配该文本之后的 s 中的每个值。

请参阅PCRE 正则表达式演示

于 2018-06-22T08:09:08.843 回答