Распарсить лог файл в PowerShell через регулярные выражения

Есть log файл такого типа

02.11.2024 19:13:47.431  Connect socket [73664050] ("", "10.10.10.1")
02.11.2024 19:13:47.789  [159211164] TX 
02.11.2024 19:13:47.789  [159211164] RX 
02.11.2024 19:13:47.797  [159211164] TX 
02.11.2024 19:13:47.797  [159211164] RX
02.11.2024 19:13:48.274  Socket [73664050] info: (...э.A ...эADDRESS=71F2;71F2§.)
02.11.2024 19:13:48.274  Socket [73664050] device codes 71F2 (29170)
02.11.2024 19:15:14.257  [73664050] TX
02.11.2024 19:15:14.257  [73664050] RX 
02.11.2024 19:15:14.267  [73664050] TX 
02.11.2024 19:15:14.267  [73664050] RX
.....
02.11.2024 19:20:14.907  [159211164] TX 
02.11.2024 19:20:14.907  [159211164] RX 
02.11.2024 19:20:14.921  [159211164] TX 
02.11.2024 19:20:14.921  [159211164] RX 
02.11.2024 19:20:20.142  [159211164] RX 
02.11.2024 19:20:20.992  Disconnect socket [73664050] ("", "10.10.10.1")
02.11.2024 19:20:21.106  [159211164] RX 
02.11.2024 19:20:21.127  [159211164] RX
02.11.2024 19:20:21.396  [159211164] TX 
02.11.2024 19:20:21.396  [159211164] RX 
02.11.2024 19:20:21.405  [159211164] TX 
02.11.2024 19:20:21.405  [159211164] RX 06
02.11.2024 19:20:22.227  Connect socket [184509040] ("", "10.10.10.2")
02.11.2024 19:20:22.962  Socket [184509040] info: (...э.A ...эADDRESS=7192;7192.м)
02.11.2024 19:20:22.962  Socket [184509040] device codes 7192 (29074)

Необходимо получить ip адрес и код устройства в таком формате

Device_Code     ip
71F2 (29170)    10.10.10.1
7192 (29074)    10.10.10.2

Проблема заключается в том, внутри коннектов могут фигурировать дисконекты по другим устройствам. И разграничить их получается только по сокетам.

UDP

Попробовал создать регулярное выражение для выборки данных Пример регулярного выражения

foreach($file in $filesed)
{
    $arrayFromFile = Get-Content -Path $file -Encoding ansi
    $arrayFromFile -split '\n' | Select-String -Pattern $patern |
          ForEach-Object {
            [PSCustomObject]@{
                LineNanber = $_.LineNumber
                Cocket = $_.Matches.Groups[1]
                coments = $_.Matches.Groups[2]
                text = $_.Matches.Groups[3]
          }
        }      
}

Но вывод не тот чего я ожидал. Не могу исключить из поиска info


Ответы (1 шт):

Автор решения: rotabor

Возможно, что решить задачу с помощью только регулярных выражений не получится. Поэтому, нужно разбить решение на два этапа.

Сначала с помощью регулярок извлечь данные по отдельности:

Socket Property Value
73664050 IP 10.10.10.1
73664050 Device Codes 71F2 (29170)

А потом с помощью Group-Object объединить записи:

@(
    @{ Socket = "73664050"; Property = "Device Codes"; Value = "71F2 (29170)" }
    @{ Socket = "73664050"; Property = "IP"; Value = "10.10.10.1" }
    @{ Socket = "73664051"; Property = "IP"; Value = "10.10.10.2" }
    @{ Socket = "73664051"; Property = "Device Codes"; Value = "7192 (29074)" }
) | Group-Object -Property { $_.Socket } |
Select-Object Name,
@{Name="IP";Expression={($_.Group | Where-Object {  $_.Property -eq "IP" }).Value} },
@{Name="Device Codes";Expression={($_.Group | Where-Object {  $_.Property -eq "Device Codes" }).Value} }

введите сюда описание изображения

В примере входным объектом для Group-Object является хэш-таблица. Для другого типа входного объекта обработка в Group-Object будет другая.


Возможны и другие решения, например:

  1. Отфильтровать строки по "Connect socket" и "device codes" (порядок строк изменён для примера) и убрать время
Socket [73664050] device codes 71F2 (29170)
Connect socket [73664050] ("", "10.10.10.1")
Connect socket [184509040] ("", "10.10.10.2")
Socket [184509040] device codes 7192 (29074)
  1. Заменить "Connect socket" на "Socket" и отсортировать
Socket [184509040] ("", "10.10.10.2")
Socket [184509040] device codes 7192 (29074)
Socket [73664050] ("", "10.10.10.1")
Socket [73664050] device codes 71F2 (29170)
  1. Поиском и заменой (Regex) убрать лишнее
10.10.10.2")
Socket [184509040] device codes 7192 (29074)
10.10.10.1")
Socket [73664050] device codes 71F2 (29170)

-->

10.10.10.2 7192 (29074)
10.10.10.1 71F2 (29170)
→ Ссылка