2012-08-09 40 views
1

我想创建一个正则表达式来匹配在tomcat服务器上发出请求的所有用户名。线的从日志中的样品:Powershell正则表达式匹配域用户名

192.10.123.45 - 域/用户名[30 /月/ 2012:07:29:13 -0400] “GET/APP/HTTP/1.1” 200 53167

问题是存在的用户名几种不同的格式:

  1. 用户名
  2. 域\用户名
  3. 域/用户名

目前的尝试:

if(($line -match “GET”) -AND ($line -match "(\s-\s\w{1,})")) { 
      $temp = $matches[0] 
      if(($line -match “GET”) -AND ($line -match "(\s-\s\w{1,}\S)?=[\\\/](w{1,}\b)")) { 
       $temp1 = $matches[0] 
       Write-host $temp 
      } 

我使用的空间,空间的用户名作为出发点之前,这似乎是工作的罚款。我总是检查该行是否具有“GET”,因为它是我们现在唯一关心的唯一PHP调用。我有两场比赛,因为第一场比赛总是只匹配一个单词,如果第二场比赛是比赛,我会使用$ temp修剪$ temp1,因为我们不关心域。我真正遇到的问题是如何用正则表达式来说“反斜杠或前向拉伸”。

此外,我不知道我的正则表达式处理的情况下,用户名将有数字或域将有破折号。我假设这是\ w \,但我无法找到任何这些情况下在我正在测试的开发中。

我很抱歉提前因为我缺乏正则表达式的知识。

回答

1

如果我理解你的问题,你希望能够从一个字符串中取出domain \ username。下面的几行将从你已经在你的例子所示什么拉出用户名:

$line = $line.split("-")[1] 
$line = $line.split("[")[0] 
$line = $line.trim() 

这将使$linedomain/username

现在值,拉出的用户名。

if ($line.Contains("/")) { 
    $Line = $Line.split("/")[1] 
} #End if($line.Contains("/")) { 
if ($line.contains("\")) { 
    $Line = $line.split("\")[1] 
} #End if ($line.contains("\")) { 

最终的结果将是一个包含用户名这可以被全部包裹在一个搜索GET

if (($line -match “GET”) { 
    $Line = $Line.Replace(" - "," < ") 
    #If there is a - in the username, this replaces it so the split doesn't break up the username. Change the < to suit whatever works best 
    $line = $line.split("<")[1] 
    $line = $line.split("[")[0] 
    $line = $line.trim() 
    if ($line.Contains("/")) { 
     $Line = $Line.split("/")[1] 
    } #End if($line.Contains("/")) { 
    if ($line.contains("\")) { 
     $Line = $line.split("\")[1] 
    } #End if ($line.contains("\")) { 
}#End if (($line -match “GET”) { 

我跟你把在那里的线路测试,我结束了$line等于username$line

我回答了这个之后,我虽然也许你想要一个正则表达式用于其他用途。所以我写了如何使用正则表达式也这么做:

if([regex]::Match($Line,".*GET.*").Success) { 
     $line = [regex]::Split($Line,".*\s[-]{1}\s") 
     $Line = [regex]::Split($Line,"\s[\[].*") 
    if ([regex]::Match($Line,"[\\]{1}|[//]{1}").Success) { 
    $Line = [regex]::Split($Line,".*[//]|.*[\\]") 
    } #End if ([regex]::Match($Line,"[\]{1}|[//]{1}").Success) { 
} #End if([regex]::Match($Line,".*GET.*").Success) { 

同样,我测试了这一点,它的工作撤出的用户名在我的环境。如果在域或用户名中有-或数字,这些关心的虚空。

+0

嘿尼克,感谢您的帮助,这几乎解决了我所有的问题。我不打算采用第一种解决方案,我没有对它进行测试,因为我想使用正则表达式,我觉得它对这些类型的东西更加有用和准确。第一条if语句正确地处理用户名或域\用户名,第二条if语句仅从域名解析出域名/用户名的域名。这仍然使案例域\用户名未处理。我认为它可能只是你的一个错字,你在if语句中有一个反斜杠,在分裂中有两个反斜杠。你可以解释这个 – Cole9350 2012-08-10 14:10:29

+0

第二个if语句检查反斜线或正斜杠。我测试了所有三个,他们没有问题。正则表达式中的a | b表示a或b。两个\的原因是为了逃避它。 /不需要转义。 – Nick 2012-08-10 19:35:21

+0

对,我用你的确切的代码,它没有工作,从来没有少我拿你显示的| (或),并使我的代码工作,所以谢谢。但是我对正则表达式有足够的了解,以了解你的写作。所以我的问题是。为什么在if语句中你有两个正斜杠,并且你不在背斜线中使用转义符?这是我的第二条if语句,类似于你的,但我的作品'if(($ line -match“GET”)-AND($ line -match“\ s [ - ] {1} \ s \ w {1,} ((\\ | /)\ w {1,} \ b)“)){$ temp = $ matches [1]; $ temp = $ temp.TrimStart(“\\ |//”); }' – Cole9350 2012-08-10 20:09:38