我的bash脚本正在解析构建作业的JSON输出,并尝试通过提取字符串result
来查找其状态,该字符串有三个选项/值:
FAILURE
,如果是构建失败SUCCESS
,成功构建null
,如果构建正在进行中我可以通过以下命令提取FAILURE
和SUCCESS
方案:
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,
有关如何在匹配模式时忽略双引号并仅提取字符串(null
或FAILURE
或SUCCESS
)的任何输入?
答案 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
如果这不是您所需要的,那么请编辑您的问题,以提供更具真实代表性的样本输入/输出。