Попытка объединить данные в одну строку - PullRequest
0 голосов
/ 24 января 2019

Я работаю в компании, у которой есть несколько веб-серверов с балансировкой нагрузки.Я создал сценарий PowerShell, который работает со всеми нашими серверами IIS, извлекает записи об ошибках 500, а затем извлекает IP-адрес клиента и показывает, сколько раз этот IP-адрес клиента вызывал ошибку 500 (да, язнаю, что мы можем использовать LogParser для этого - но это было предлогом, чтобы помочь освоить некоторые базовые навыки PowerShell).

Прямо сейчас мой вывод показывает имя веб-сервера, количество и IP-адрес.В идеале я хотел бы, чтобы подсчет суммировал подсчет по всем веб-серверам и показывал IP-адрес.Я включил код, приведенный ниже, с фактическим и желаемым выходом.

$source      = "WebServer"
$destination = "LogServer01"
$date        = "190122"

if (Test-Path \\$destination\Drive$\Temp\LogFiles\IISLogs\"IISLogs-for-$($date)".txt) {
    Remove-Item \\$destination\Drive$\Temp\LogFiles\IISLogs\"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 \\$serverName\D$\LogFiles\WebSite\W3SVC20000\"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 >> \\$destination\D$\Temp\LogFiles\IISLogs\"IISLogs-for-$($date)".txt
};

Желаемый вывод:

Count    Name
17       186.0.25.8
15       202.58.5.16
12       96.58.1.58

Фактический вывод:

Webserver01   Count   Name
              5       186.0.25.8
              3       202.58.5.16
              2       96.58.1.58
Webserver02   Count   Name
              4       186.0.25.8
              2       202.58.5.16
              1       96.58.1.58
Webserver03   Count   Name
              4       186.0.25.8
              1       202.58.5.16
              2       96.58.1.58

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вот решение, которое я придумала, все, что мне нужно было сделать, это добавить в командлет Format-Table a -Group По «Name» и установить -Property в «Count», вот мой код для тех, кто заинтересован :

$source         =       "Webserver"
$destination    =       "LogServer01" 
$date           =       "190122"
if (Test-Path \\$destination\D$\Temp\LogFiles\IISLogs\"IISLogs-for-$($date)".txt) {
  Remove-Item \\$destination\D$\Temp\LogFiles\IISLogs\"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 \\$serverName\D$\LogFiles\WebSite\W3SVC20000\"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 >> \\$destination\D$\Temp\LogFiles\IISLogs\"IISLogs-for-$($date)".txt
            };
0 голосов
/ 24 января 2019

Простой подход: добавьте имя сервера в качестве вычисляемого свойства:

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

Хотя это не даст вам желаемого результата.Вместо этого вы получите:

ServerName   Count  Name
----------   -----  ----
Webserver01  5      186.0.25.8
Webserver01  3      202.58.5.16
Webserver01  2      96.58.1.58
Webserver02  4      186.0.25.8
Webserver02  2      202.58.5.16
Webserver02  1      96.58.1.58
Webserver03  4      186.0.25.8
Webserver03  1      202.58.5.16
Webserver03  2      96.58.1.58

Однако я бы посчитал этот формат предпочтительным, потому что, заменив Format-Table ... >> ... на Export-Csv, вы можете экспортировать данные в формат, который легко читается другими приложениями..

Если вы хотите, чтобы вывод был точно таким же, как в вашем вопросе, вам необходимо создать пользовательский вывод, например, с помощью оператора формата (-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'
...