1

我正在尝试创建一个正则表达式来匹配在 tomcat 服务器上发出请求的所有用户名。日志中的行示例:

192.10.123.45 - 域/用户名 [30/Jul/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 调用。我有 2 个匹配项,因为第一个匹配项总是只匹配一个单词,如果第二个匹配项匹配,我将使用 $temp 修剪 $temp1,因为我们不关心域。我真正遇到的麻烦是如何用正则表达式说“反斜杠或正斜杠”。

另外,我不确定我的正则表达式是否处理用户名将有数字或域将有破折号的情况。我假设这是由 \w 拾取的,但我在开发中找不到任何我正在测试的案例。

对于我对正则表达式缺乏了解,我提前道歉。

4

1 回答 1

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”) {

我用你放在那里的线进行了测试,结果是$lineequaling username

在我回答了这个问题之后,我想你可能想要一个用于其他用途的正则表达式。所以我也写了如何用正则表达式来做到这一点:

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) {

同样,我对此进行了测试,它可以在我的环境中提取用户名。-这些都不关心域或用户名中是否有数字。

于 2012-08-09T22:43:49.483 回答