我的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
)的任何输入?
您可以在正则表达式中使用多个组,如下所示:
echo $'..."result":null...n..."result":"FAILURE"...' |
sed -e 's/^.*"result":("([^"]*)"|(null)).*$/23/'
上面的示例输出
null
FAILURE
表达式要么匹配第一个(引号)要么匹配第二个(空)替代项(|
),永远不会同时匹配。相应的组是2
和3
。
如果你的 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
如果这不是您所需要的,请编辑您的问题以提供更具代表性的示例输入/输出。