我正在尝试创建一个正则表达式,以匹配在tomcat服务器上发出请求的所有用户名。日志中的行样本:
192.10.123.45 - domain / username [30 / Jul / 2012:07:29:13 -0400]“GET / APP / HTTP / 1.1”200 53167
问题是用户名有几种不同的格式:
目前的尝试:
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调用。我有2个匹配,因为第一个匹配将始终匹配一个单词,如果第二个匹配,则使用$ temp修剪$ temp1,因为我们不关心域。我真正遇到的问题是如何用正则表达式来说“反斜杠或者Forwardslash”。
此外,我不确定我的正则表达式是否处理用户名将包含数字或域将具有破折号的情况。我假设这是由\ w拾取但我找不到我正在测试的开发中的任何这些案例。
我提前道歉,因为我对正则表达式缺乏了解。
答案 0 :(得分:1)
如果我理解您的问题,您希望能够从一串字符中提取域\用户名。以下行将从您在示例中显示的内容中提取用户名:
$line = $line.split("-")[1]
$line = $line.split("[")[0]
$line = $line.trim()
这会使$line
的值domain/username
现在,提取用户名。
if ($line.Contains("/")) {
$Line = $Line.split("/")[1]
} #End if($line.Contains("/")) {
if ($line.contains("\")) {
$Line = $line.split("\")[1]
} #End if ($line.contains("\")) {
最终结果将是$line
包含用户名这可以全部包含在搜索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
。
在我回答这个问题后,我想也许你想要一个正则表达式用于其他用途。所以我也用regex写了如何做到这一点:
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) {
再次,我测试了这个,它在我的环境中提取用户名。如果域名或用户名中有-
或数字,则需要更加谨慎。