2014-12-03 4 views
0

Я пытаюсь проанализировать группу текстовых файлов (журналы MSFTP) и делать подсчеты IP-адресов, которые отправили плохие учетные данные. Я думаю, что это сработало, за исключением того, что я не думаю, что массив правильно переходит в/из функции. В результате я получаю дубликаты записей, если один и тот же IP-адрес появляется в нескольких файлах журнала. Что я делаю не так?Объединение подобных объектов в массив

Function LogBadAttempt($FTPLog,$BadPassesArray) 
    { 
    $BadPassEx="PASS - 530" 
    Foreach($Line in $FTPLog) 
     { 
     if ($Line -match $BadPassEx) 
      { 
      $IP=($Line.Split(' '))[1] 
      if($BadPassesArray.IP -contains $IP) 
       { 
       $CurrentIP=$BadPassesArray | Where-Object {$_.IP -like $IP} 
       [int]$CurrentCount=$CurrentIP.Count 
       $CurrentCount++ 
       $CurrentIP.Count=$CurrentCount 
       }else{ 
       [email protected]{"IP"=$IP;"Count"='1'} 
       $BadPass=New-Object -TypeName PSObject -Property $info 
       $BadPassesArray += $BadPass 
       } 
      } 
     } 
    return $BadPassesArray 
    } 
[email protected]() 
$FTPLogs = Get-Childitem \\ftpserver\MSFTPSVC1\test 
$Result = ForEach ($LogFile in $FTPLogs) 
    { 
    $FTPLog=Get-Content ($LogFile.fullname) 
    LogBadAttempt $FTPLog 
    } 
$Result | Export-csv C:\Temp\test.csv -NoTypeInformation 

Результат выглядит ...

Count IP 
7 209.59.17.20 
20 209.240.83.135 
18441 209.59.17.20 
13059 200.29.3.98 

и хотели бы, чтобы объединить записи для 209.59.17.20

+0

У вас есть ключ, IP-адрес. Вы могли бы найти этот ключ до добавления нового объекта в ваш массив. Если вы его найдете, верните счет, увеличьте его с новым значением и отпустите в следующий раунд. –

+0

Это то, что я пытался с помощью if ($ BadPassesArray.IP -contains $ IP). Он отлично работает, когда я работаю над одним и тем же файлом журнала. Когда он переходит к следующему файлу журнала, он как будто создает новую версию массива для этого цикла, так как не видит объект с тем же значением IP, чтобы он начинал новый. –

ответ

3

Вы делаете этот путь слишком сложно. Обработать файлы в конвейере и использовать хэш-таблицу для подсчета вхождений каждого IP-адреса:

$BadPasswords = @{} 

Get-ChildItem '\\ftpserver\MSFTPSVC1\test' | Get-Content | ? { 
    $_ -like '*PASS - 530*' 
} | % { 
    $ip = ($_ -split ' ')[1] 
    $BadPasswords[$ip]++ 
} 

$BadPasswords.GetEnumerator() | 
    select @{n='IP';e={$_.Name}}, @{n='Count';e={$_.Value}} | 
    Export-Csv 'C:\Temp\test.csv' -NoType 
+0

Действительно, я был. Это сработало отлично (после добавления s к $ BadPassword [$ ip] ++). Благодаря! –

Смежные вопросы