Powershell дорогой парсинг - PullRequest
1 голос
/ 24 марта 2009

Вот небольшой фрагмент из сценария, который я пишу;

Get-Content $tempDir\$todaysLog | Where-Object { $_ -match "" } |
    ForEach-Object -Process {
    $fields = [regex]::split($_,'@|\s+')
    Add-Content -Path $importSource2\$todaysLog -value ($($fields[0]) + "`t"  + $($fields[1]) + "`t" + $($fields[2]) + " " + $($fields[3])+ "`t" + "<*sender*@"+($($fields[5])) + "`t" + "<*recipient*@"+($($fields[7])))
    }

Извините за перенос, по сути, он разбивает элементы файла на массивы, а затем записывает определенные элементы с другим текстом вокруг него. Цель состоит в том, чтобы заменить отправляющую информацию об отправителе / ​​получателе чем-то бессмысленным.

Вот пример файла журнала, который я анализирую;

10.197.71.28 SG 02012009 00:00:00 <['rece@kpmg.com.sg']>

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

Приветствия

Ответы [ 3 ]

1 голос
/ 24 марта 2009
cat $tempDir\$todaysLog |
  %{ [regex]::Replace($_, "[A-Z0-9._%+-]+(@[A-Z0-9.-]+\.[A-Z]{2,4}\s<\[')[A-Z0-9._%+-]+(@[A-Z0-9.-]+\.[A-Z]{2,4}'\]>)", '*sender*$1*recipients*$2', "IgnoreCase") } > $importSource2\$todaysLog

Записи в журнале должны быть похожи на строку примера (особенно часть sender@kpmg.com <['rece@kpmg.com.sg']>).


Редактировать : Я провел несколько тестов (1 мес файл (пример ~ 15000 строк)):

Решение Энди Уокера (с использованием split ) -> 18,44s

Measure-Command {

Get-Content $tempDir\$todaysLog | Where-Object { $_ -match "" } |
    ForEach-Object -Process {
    $fields = [regex]::split($_,'@|\s+')
    Add-Content -Path $importSource2\$todaysLog -value ($($fields[0]) + "`t"  + $($fields[1]) + "`t" + $($fields[2]) + " " + $($fields[3])+ "`t" + "<*sender*@"+($($fields[5])) + "`t" + "<*recipient*@"+($($fields[7])))
    }

}

решение Дангфа (с использованием заменить ) -> 18,16 с

Measure-Command {

Get-Content $tempDir\$todaysLog | Where-Object { $_ -match "" } |
    ForEach-Object -Process {
    $s2 = $_ -replace "\t[^@\t']+@", "`t*sender*@"
    $s3 = $s2 -replace "\<\['.+@", "<['*recipient*@"
    Add-Content -Path $importSource2\$todaysLog -value $s3
    }

}

Решение Madgnome (с использованием regex ) -> 6,16s

Measure-Command {

cat $tempDir\$todaysLog |
  %{ [regex]::Replace($_, "[A-Z0-9._%+-]+(@[A-Z0-9.-]+\.[A-Z]{2,4}\s<\[')[A-Z0-9._%+-]+(@[A-Z0-9.-]+\.[A-Z]{2,4}'\]>)", '*sender*$1*recipients*$2', "IgnoreCase") } > $importSource2\$todaysLog

}
0 голосов
/ 02 апреля 2009

Не следует использовать Powershell в качестве движка для разбора журнала большого размера. Я бы использовал logparser.exe (у вас есть разделенная пробелами запись, которую можно преобразовать в csv), а затем использовал import-csv в Powershell для воссоздания объекта Powershell. Оттуда вы можете удалить и заменить поля (для каждого объекта). Powershell - это клей, а не топливо. Использование его для анализа больших журналов любого размера не совсем глупо, но будет дорогостоящим для вас и процессора. Хотя у Ли Холмса есть превосходный файл Convert-TextObject.ps1 из его книжных примеров на http://examples.oreilly.com/9780596528492/, вам нужен какой-то механизм разбора журнала, который бы справлялся с тяжелой работой.

0 голосов
/ 24 марта 2009
$s1 = "10.197.71.28 SG  02012009 00:00:00   sender@kpmg.com <['recip@kpmg.com.sg']>"
$s2 = $s1 -replace "\t[^@\t']+@", "`t*sender*@"
$s3 = $s2 -replace "\<\['.+@", "<['*recipient*@"
write-host $s3

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

Обратите внимание , что если вы копируете и вставляете вышеуказанный код, вам может потребоваться вручную вставить символ табуляции перед «отправителем» в первой строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...