无法匹配JSON输出中的模式

时间:2016-06-04 13:57:15

标签: bash sed grep

我的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)的任何输入?

3 个答案:

答案 0 :(得分:2)

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

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

以上示例输出

null
FAILURE

表达式匹配第一个(引用的)或第二个(null)替代(\|),而不是两者。相应的组是\2\3

答案 1 :(得分:1)

如果你的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
    

答案 2 :(得分:0)

只需使用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

如果这不是您所需要的,那么请编辑您的问题,以提供更具真实代表性的样本输入/输出。