无法匹配 JSON 输出中的模式



我的bash脚本正在解析构建作业的JSON输出,并尝试通过提取字符串result来查找其状态,该字符串具有三个选项/值:

  • FAILURE,如果它是一个失败的构建
  • SUCCESS,成功的构建
  • null,如果构建正在进行

我可以通过以下命令提取FAILURESUCCESS场景:

val1=`curl -k -s $MY_URL ` 
output=`echo $val1 | sed -e 's/^.*"result":"([^"]*)".*$/1/'`

但我无法使用上述命令提取null的值,因为它没有括在双引号内。

正在进行的 JSON 输出:

"keepLog":false,"number":10,"result":null,"timestamp":1456785876,

完成的构建 JSON 输出如下所示:

"keepLog":false,"number":10,"result":"FAILURE","timestamp":1456785876,

关于如何在匹配模式时忽略双引号并仅提取字符串(nullFAILURESUCCESS)的任何输入?

您可以在正则表达式中使用多个组,如下所示:

echo $'..."result":null...n..."result":"FAILURE"...' | 
sed -e 's/^.*"result":("([^"]*)"|(null)).*$/23/'

上面的示例输出

null
FAILURE

表达式要么匹配第一个(引号)要么匹配第二个(空)替代项(|),永远不会同时匹配。相应的组是23

如果你的 grep支持 Perl 兼容的正则表达式 (PCRE),你可以使用以下命令:

grep -Po '"result":"?K[^",]*(?="?,)' infile

其中infile的内容是

"keepLog":false,"number":10,"result":null,"timestamp":1456785876,
"keepLog":false,"number":10,"result":"FAILURE","timestamp":1456785876,
  • -o仅保留匹配的部分
  • "result":"?K匹配K之前的部分,但不将其包含在匹配中("可变长度正后看")
    • "?是可选的",因此"result":""result":都匹配
  • [^",]*匹配任意数量的字符,这些字符既不是"也不是,
  • (?="?,)是一个积极的前瞻,即匹配后必须跟有模式"?,:一个可选的"后跟一个逗号

如果您的 grep不支持PCRE,您可以使用两个这样的命令(相同的输入文件):

grep -Eo '"result":"?[^",]*' infile | grep -o '[^":]*$'
  • -E用于扩展正则表达式,因此我们可以使用?修饰符
  • -o同上
  • "result":"?[^",]*匹配"result":"result":"后跟除",以外的任意数量的字符 – 第一个命令的输出如下所示:

    "result":null
    "result":"FAILURE
    
  • 在第二个命令中,[^":]*$匹配字符串末尾除":以外的任意数量的字符,从而导致

    null
    FAILURE
    

只需使用 awk:

$ cat file
"keepLog":false,"number":10,"result":null,"timestamp":1456785876,
"keepLog":false,"number":10,"result":"FAILURE","timestamp":1456785876,
$ awk -F'[:",]+' '{print $7}' file
null
FAILURE

或者,如果您的日志文件中的内容比您向我们显示的要多,并且您只需要找到"结果"行:

$ awk -F'[:",]+' '$6=="result"{print $7}' file
null
FAILURE

如果这不是您所需要的,请编辑您的问题以提供更具代表性的示例输入/输出。

相关内容

  • 没有找到相关文章

最新更新