我通过一些日志文件运行正则表达式。 捕获组应捕获一些相关字段。 我想知道日志文件是否提到了作业的成功结束。这可以通过字符串的存在与否来结束"作业成功执行"
到目前为止我的正则表达式:
^Job started at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+orderno\s+-\s+'(\w+)'\s+runno\s+-\s+'(\d+)'[\s\S]+Host1\s'([\w.]+)'\[([\w-]+)\] username '([\w\\]+)' - Host2\s'([\w.]+)'\[([\w-]+)\] username '([\w\\]+)'[\s\S]+(Job executed successfully)?[\s\S]+Job ended at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+Elapsed time\s\[([\d.]+)sec\]\sCPU usage\s\[([\d.]+)sec]
(我是正则表达式的新手,所以它根本不是完美的,需要一些强化)
成功结束的示例日志: 上面的正则表达式只有在问号背后"(作业成功执行)?"在我看来,这是不必要的。
工作开始于' 0902 23:56:00:367' orderno - ' 0tzh0' runno - ' 00064' 转账数量 - 1
主机1'本地' [Windows-LOCAL]用户名' xxx \ xxx' - Host2' xxx.xxx.xx' [Unix-SFTP]用户名' xxx'
本地主机是:xxx - Windows 200x [601] Service Pack 1 build 7601 - Intel64 Family 6 Model 37 Stepping 1,GenuineIntel
**********从1开始转移#1 *************** 转移#1已成功完成
作业成功执行。离开。
工作在' 0902 23:56:07:138' 经过时间[7秒] CPU使用率[0.15秒]
结尾不成功的示例日志: 上面的正则表达式就像应该的那样。
工作开始于' 0831 15:26:00:365' orderno - ' 0tuq5' runno - ' 00030' 转账数量 - 4
主机1'本地' [Windows-LOCAL]用户名' xxx \ xxx' - Host2' xxx.xxx.xx' [Unix-SFTP]用户名' xxx'
本地主机是:xxx - Windows 200x [601] Service Pack 1 build 7601 - Intel64 Family 6 Model 37 Stepping 1,GenuineIntel
**********从4开始转移#1 *************** 无法连接到' xxx.xxx.xx上的SSH服务器':SFTP_Connect:psftp_connect失败:ssh_init:网络错误:连接超时
无法建立与主机sftp.onenet.be的连接
工作在' 0831 15:26:21:426'
结束经过时间[21秒] CPU使用率[0.0秒]
答案 0 :(得分:0)
如果你正在使用PCRE
,你可以使用神话般的\Q...\E
序列和neg。先行:
^\QJob started\E
(?:(?!\QJob ended\E).)+?
^\QJob executed successfully\E
请参阅a demo on regex101.com(并注意multiline
,verbose
和singleline
修饰符!)。
如果没有,整个表达式有点难以理解:
^Job started(?:(?!Job ended).)+?^Job executed successfully
答案 1 :(得分:0)
对正则表达式进行最小的更改,您可以使用以下内容:
^Job started at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+orderno\s+-\s+'(\w+)'\s+runno\s+-\s+'(\d+)'[\s\S]+?Host1\s'([\w.]+)'\[([\w-]+)\] username '([\w\\]+)' - Host2\s'([\w.]+)'\[([\w-]+?)\] username '([\w\\]+)'[\s\S]+?(?:(Job executed successfully)[\s\S]+?)?Job ended at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+Elapsed time\s\[([\d.]+)sec\]\sCPU usage\s\[([\d.]+)sec]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^^^-----------------------------------^^
(上面^
指示的主要变化)
我还将一些量词转换为懒惰,这会使事情变得更快。
由于[\s\S]+
和回溯(从右到左)的贪婪匹配和(Job executed successfully)?[\s\S]+
的测试,您当前的正则表达式会匹配所有内容直到最后,并且[\s\S]+
将匹配为找到Job ended
后即可。
以上述方式,我们从左到右检查每个字符,直到我们到达我们需要的部分,即Job executed successfully
(如果存在)。