试图将数据组合成一行



我在一家公司工作,该公司拥有一些负载平衡的web服务器。我已经创建了一个PowerShell脚本,该脚本针对我们所有的IIS服务器,提取500个错误条目,然后提取客户端的IP地址,并向我显示该客户端IP地址导致500个错误的次数(是的,我知道我们可以使用LogParser,但这是帮助学习一些基本PowerShell技能的借口)。

现在,我的输出显示了web服务器名称、计数和IP地址。理想情况下,我希望计数聚合所有web服务器的计数,并显示IP地址。我已经包含了下面的代码,包括实际输出和所需输出。

$source      = "WebServer"
$destination = "LogServer01"
$date        = "190122"
if (Test-Path \$destinationDrive$TempLogFilesIISLogs"IISLogs-for-$($date)".txt) {
Remove-Item \$destinationDrive$TempLogFilesIISLogs"IISLogs-for-$($date)".txt  
}
for ($i = 1; $i -lt 13; $i++) {
if ($i -lt 10) {
$serverName = "$($source)0$($i)"
} else {
$serverName = "$($source)$($i)"
}
# Grabbing the logs
Get-Content -Path \$serverNameD$LogFilesWebSiteW3SVC20000"u_ex$($date)*.log" |
Where-Object { $_.Contains(" 500")} |
ForEach-Object { $_.Split(" ")[15] } |
Group-Object |
Where-Object { $_.Count -gt 1 } |
Where-Object { $_.Name -ne "-" } |
Sort-Object Count -Descending |
Format-Table Count, Name >> \$destinationD$TempLogFilesIISLogs"IISLogs-for-$($date)".txt
};

期望输出:

计数名称17 186.0.25.815 202.58.5.1612 96.58.1.58

实际输出:

Webserver01计数名称5 186.0.25.83 202.58.5.162 96.58.1.58Webserver02计数名称4 186.0.25.82 202.58.5.161 96.58.1.58Webserver03计数名称4 186.0.25.81 202.58.5.162 96.58.1.58

简单方法:添加服务器名称作为计算属性:

... |
Group-Object -NoElement |
Select-Object @{n='ServerName';e={$serverName}}, Count, Name |
...

不过,这并不能给您提供所需的输出。相反,你会得到:

ServerName计数名称-------------------Web服务器01 5 186.0.25.8Web服务器01 3 202.58.5.16Web服务器01 2 96.58.1.58Web服务器02 4 186.0.25.8Web服务器02 2 202.58.5.16Web服务器02 1 96.58.1.58Web服务器03 4 186.0.25.8Web服务器03 1 202.58.5.16Webserver03 2 96.58.1.58

但是,我认为这种格式更可取,因为通过用Export-Csv替换Format-Table ... >> ...,您可以以其他应用程序可以轻松读取的格式导出数据。

如果您想要与问题中完全相同的输出,则需要创建自定义输出,例如通过格式运算符(-f)。

$data = Get-Content -Path ... |
...
Sort-Object Count -Descending
'{0,-15} Count  Name' -f $serverName | Set-Content 'C:output.txt'
$data | ForEach-Object {
'{0,-15}  {1,-5}  {2}' -f '', $_.Count, $_.Name
} | Add-Content 'C:output.txt'

这是我想出的解决方案,我所要做的就是向Format Table cmdlet中添加一个-Group By"Name"并将-Property设置为"Count",这是我为感兴趣的人编写的代码:

$source         =       "Webserver"
$destination    =       "LogServer01" 
$date           =       "190122"
if (Test-Path \$destinationD$TempLogFilesIISLogs"IISLogs-for-$($date)".txt) {
Remove-Item \$destinationD$TempLogFilesIISLogs"IISLogs-for-$($date)".txt  
}
for($i = 1; $i -lt 13; $i++)
{if ($i -lt 10)
{
$serverName = "$($source)0$($i)"
}
else {
$serverName = "$($source)$($i)"
}
Get-Content -Path \$serverNameD$LogFilesWebSiteW3SVC20000"u_ex$($date)*.log" |
Where-Object {   $_.Contains(" 500")} |
ForEach-Object {$_.split(" ")[15]} |
Group-Object | ## Grouping the data by name column (IP Address)
Where-Object {$_.Count -gt 1} |
Where-Object {$_.Name -ne "-"} |
Sort-Object Count -Descending |
Format-Table -GroupBy Name -Property Count >> \$destinationD$TempLogFilesIISLogs"IISLogs-for-$($date)".txt
};

相关内容

  • 没有找到相关文章

最新更新