Лучший отвечающий
Парсинг лог файла

Вопрос
-
Народ подскажите как правильно парсить лог файл. Нарпример есть такой файл:
2010-11-23T00:00:00.262Z,08CD56DF1732684D,192.168.0.10:25
...
Разобрать то его не сложно( спсб Василию Гусеву за его статьи)
Например так выгрызем два значения из каждой строки:
get-content c:\AgentLog20101123-1.LOG | foreach-object{
$tmp = $_ -match "(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z),(\d{2}..\d{2}..\d{7}.)"
}А вот теперь вопрос, а можно ли сделать так чтобы эти данные хранились и вывод их был похож на вывод например на Get-Proccess | Format-Table, т.е мы храним эти данные в массиве(матчинг будет само собое длиннее и сложнее), и допустим уже оттуда делаем определенные запросы на выборку, т.е грубо хочу сделать парсинг Exchange Antispam Log который вытаскивает из лога информацию по работе, убирает оттуда не нужный мусор. Извините за сумбур.
28 ноября 2010 г. 8:35
Ответы
-
$a=@();get-content c:\AgentLog20101123-1.LOG | foreach-object {[void]($_ -match "(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z),(\d{2}..\d{2}..\d{7}.)");$a+=$matches}
- Помечено в качестве ответа box210277 28 ноября 2010 г. 11:35
28 ноября 2010 г. 9:26Отвечающий
Все ответы
-
$a=@();get-content c:\AgentLog20101123-1.LOG | foreach-object {[void]($_ -match "(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z),(\d{2}..\d{2}..\d{7}.)");$a+=$matches}
- Помечено в качестве ответа box210277 28 ноября 2010 г. 11:35
28 ноября 2010 г. 9:26Отвечающий -
Я обычно делаю так:
Get-Content .\log.log | where {$_ -match '^([^Z]+Z),([\dA-F]{16}),([\d\.]+):(\d+)'} |
Select-Object @{name="Date"; Expression={[datetime]::Parse($Matches[1])}},
@{name="Hash";expression={$matches[2]}},
@{n="IPAddress";e={$matches[3]}},
@{n="Port";e={[int]($matches[4])}}
AKA Xaegr, MVP: PowerShell Блог: http://xaegr.wordpress.com- Предложено в качестве ответа Vasily GusevModerator 28 ноября 2010 г. 10:09
28 ноября 2010 г. 10:09Модератор -
Не маленько не то мне нужно получить например так:
Дата ID IP
2010-11-23T00:00:00.262Z 08CD56DF1732684D 192.168.0.10:25
А в результате имею:
Name Value
---- -----
ID 08CD56DF1732684D
Date 2010-11-23T00:00:00.262Z
Name Value
---- -----
2 08CD56DF17326856
1 2010-11-23T00:01:23.038Z
0 2010-11-23T00:01:23.038Z,08CD56DF17326856
Name Value
---- -----
2 08CD56DF17326856
1 2010-11-23T00:01:23.038Z
0 2010-11-23T00:01:23.038Z,08CD56DF17326856
28 ноября 2010 г. 11:37 -
Спасибо большое, просто только начал изучать PoSH поэтому не все очевидно, и исчерпывающей информации на русском маловато, на английском полно но боюсь что то упустить.
ЗЫ Еще раз спасибо за Ваш блог.
28 ноября 2010 г. 11:40 -
Васлилий а подскажите пжста, допустим есть такой кусочек лога:
2010-11-23T00:00:00.262Z,08CD56DF1732684D,192.168.0.10:25,201.26.82.229:57884,201.26.82.229,,no-reply@rolex.com,,abor2002@mydomain.ru,1,Connection Filtering Agent,OnRcptCommand,RejectCommand,"550 5.7.1 Recipient not authorized, your IP has been found on a block list",BlockListProvider,zen.spamhaus.org,
Как составить похитрее регулярное выражение для вот этого кусочка
no-reply@rolex.com,,abor2002@mydomain.ru
Т.е один ведь sender второй recepient
28 ноября 2010 г. 13:03 -
Васлилий а подскажите пжста, допустим есть такой кусочек лога:
2010-11-23T00:00:00.262Z,08CD56DF1732684D,192.168.0.10:25,201.26.82.229:57884,201.26.82.229,,no-reply@rolex.com,,abor2002@mydomain.ru,1,Connection Filtering Agent,OnRcptCommand,RejectCommand,"550 5.7.1 Recipient not authorized, your IP has been found on a block list",BlockListProvider,zen.spamhaus.org,
Как составить похитрее регулярное выражение для вот этого кусочка
no-reply@rolex.com,,abor2002@mydomain.ru
Т.е один ведь sender второй recepient
Самое простое,то можно так:
PS > gc log.log | ? {$_ -match ',,(.+),,(.+),\d+' } | select @{n='Sender';e={$matches[1]}},@{n="Recepient";e={$matches[2 ]}} Sender Recepient ------ --------- no-reply@rolex.com abor2002@mydomain.ru
28 ноября 2010 г. 13:30Отвечающий -
Kazun
Спасибо большое. Меня вот только одно еще смущает, то что строки не постоянны по содержимому, например:
можнт быть
2010-11-23T00:00:00.262Z,08CD56DF1732684D,192.168.0.10:25,201.26.82.229:57884,201.26.82.229,,no-reply@rolex.com,,abor2002@mydomain.ru,1,Connection Filtering Agent,OnRcptCommand,RejectCommand,"550 5.7.1 Recipient not authorized, your IP has been found on a block list",BlockListProvider,zen.spamhaus.org,
А может быть и
2010-11-23T00:01:28.346Z,08CD56DF17326857,192.168.0.10:25,188.40.98.144:57302,188.40.98.144,<1186e043590fec5ea22563fc883be214@localhost.localdomain>,support@ypag.ru,noreply@ypag.ru;,info@mydomain.ru,1,Content Filter Agent,OnEndOfData,AcceptMessage,,SCL,1,
Вот сижу и думаю как все это привести в божеский вид.
Да кстати по поводу первого поста сделал как показал Василй:
get-content c:\AgentLog20101123-1.LOG | foreach-object{ $_ -match "(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z),(\d{2}..\d{2}..\d{7}.),(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}:\d{2,3})"}|
Select-Object @{name="Date"; Expression={[datetime]::Parse($Matches[1])}},@{name="ID";expression={$matches[2]}}, @{name="IP";expression={$matches[3]}}| Format-Table -AutoSizeРезультат:
Date ID IP
---- -- --
23.11.2010 3:00:00 08CD56DF1732684D 192.168.0.10:25
23.11.2010 3:00:04 08CD56DF1732684E 192.168.0.10:25
23.11.2010 3:00:11 08CD56DF1732684F 192.168.0.10:25
23.11.2010 3:00:16 08CD56DF1732684F 192.168.0.10:25
23.11.2010 3:00:33 08CD56DF17326851 192.168.0.10:25
23.11.2010 3:00:38 08CD56DF17326852 192.168.0.10:25
23.11.2010 3:00:43 08CD56DF17326853 192.168.0.10:25
23.11.2010 3:00:56 08CD56DF17326854 192.168.0.10:25
23.11.2010 3:01:08 08CD56DF17326855 192.168.0.10:25
23.11.2010 3:01:23 08CD56DF17326856 192.168.0.10:25Т.е грубо то что мне и нужно было удобочитаемый формат, и порадовало использование статики функций для нормального отображения даты, мельком читал про них теперь вот первый раз попробовал.
ЗЫ И все таки может есть идеи как парсить такой файл?
ЗЫЗЫ А может быть еще и такая запись:
2010-11-23T02:16:22.475Z,,,,,,,,abor2002@mydomain.ru,,,,,,,,
28 ноября 2010 г. 16:42 -
Я бы вообще тогда обошелся без regex и сделал все с помощью split.
gc log.log | Foreach {$obj=@()} ` { $a = "" | select Sender,Recepient $temp= $_ -split "," $a.Sender = $temp[6] $a.Recepient=$temp[8] $obj+=$a } {$obj} Sender Recepient ------ --------- no-reply@rolex.com abor2002@mydomain.ru support@ypag.ru info@mydomain.ru
gc log.log| select @{n="Sender";e={($_ -split ",")[6]}},@{n="Recepient";e={($_ -split ",")[8]}} Результат тот же.
28 ноября 2010 г. 17:06Отвечающий