在日志文件中使用正则表达式匹配字符串后匹配前n个字符

时间:2015-06-09 07:56:42

标签: c# regex

我在日志文件中有这样的一行:

  

2015年4月24日00:13:22(通知)sudo:mailwall:TTY = unknown;   PWD = / data / scanner / jobs / bmagent; USER = root; COMMAND = / usr / bin / yum -d 1 -c   /data/yum/etc/yum.conf --get-desc --check-only install sms-appliance-   release-10.5.2-3接受支持密码

我需要搜索以"accepted password for support"结尾的行,并在这些行的开头返回时间戳,例如"2015 Apr 24 00:13:22"

我得到了这个正则表达式:

(\b.*)(?=\baccepted\b.\bpassword\b.\bfor\b.\bsupport\b)

返回整行。我只想要前20个字符(时间戳)。

如何更改正则表达式?

2 个答案:

答案 0 :(得分:1)

尝试一个匹配的比赛开始并向前看:

^.{20}(?=.*accepted password for support$)

见l ive demo

如果你不能使用预见,请尝试第1组:

^(.{20}).*accepted password for support$

答案 1 :(得分:1)

根据您在评论中提供的内容,在C#中,您根本不需要使用正则表达式来完成此任务。

var result2 = txt.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
         .Where(p => p.Trim().EndsWith("accepted password for support") && p.Length > 19)
         .FirstOrDefault().Substring(0, 20);

enter image description here

或者,正则表达式解决方案:

var txt = "\r\n2015 Apr 24 00:13:22 (notice) sudo: mailwall : TTY=unknown ; PWD=/data/scanner/jobs/bmagent ; USER=root ; COMMAND=/usr/bin/yum -d 1 -c /data/yum/etc/yum.conf --get-desc --check-only install sms-appliance-release-10.5.2-3 accepted password for support\r\nOne more line";
var rgx = new Regex(@"(?m)^\d{4}\s+\p{L}{3}\s+\d{1,2}\s+\d{2}(?::\d{2}){2}(?=.*?\baccepted\s+password\s+for\s+support\b)");
var result = rgx.Match(txt).Value;

enter image description here

实际上,@ Bohemian正则表达式also works,您只需指定RegexOptions.Multiline标志,或在模式的开头使用(?m)内联选项。

什么是 MULTILINE 选项?

此选项右侧的模式中的

(?m)内联选项强制^$的开头和结尾相匹配,而不是整个字符串。 (?m)RegexOptions.Multiline的区别在于后者是针对整个模式设置的,并且可以为模式的一部分设置内联变体。