Распарсить лог файл в 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 шт):
Возможно, что решить задачу с помощью только регулярных выражений не получится. Поэтому, нужно разбить решение на два этапа.
Сначала с помощью регулярок извлечь данные по отдельности:
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 будет другая.
Возможны и другие решения, например:
- Отфильтровать строки по "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)
- Заменить "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)
- Поиском и заменой (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)