Разбор пользовательских файлов журнала
У меня есть файл журнала (*.log), который я хочу проанализировать и запросить, как показано ниже:
Строка 33043: 17.07.2016;13:26:45;GetMasterOrderNo; Номер основного заказа: 1117103907 для SoSupplierOrderNo, 1117103907 Строка 33048: 17.07.2016;13:26:45;AddAutoPurchHdr; Не удалось сохранить запись PurchaseHdr - Номер заказа поставщика уже использовался в накладной №117103907 (заказ №117103907), имя поставщика (51), строка 33049: 17/07/2016;13:26:45;ImportASN;ConvertASNFiles: не удалось импортировать GRN1171_0000700384_1117103907. XML. Не удалось сохранить запись PurchaseHdr - номер заказа поставщика уже использовался в накладной №117103907 (заказ №117103907), имя поставщика поставщика (51)
Я хочу разделить каждую строку заголовками следующим образом:
- Линия,
- Дата,
- Время,
- Тип,
- Описание
... так что я могу выполнить запросы по этому вопросу.
Каков наилучший способ сделать это?
3 ответа
Вы можете использовать регулярное выражение для захвата этих полей:
$content = Get-Content 'your_log_path' -raw
$regex = 'Line\s+(\d+):\s+([^;]+);([^;]+);([^;]+);(.+)'
[regex]::Matches($content, $regex) | ForEach-Object {
[PsCustomObject]@{
Line = $_.Groups[1].Value
Date = $_.Groups[2].Value
Time = $_.Groups[3].Value
Type = $_.Groups[4].Value
Description = $_.Groups[5].Value
}
}
Выход:
Line : 33043
Date : 17/07/2016
Time : 13:26:45
Type : GetMasterOrderNo
Description : Master Order No is : 1117103907 for SoSupplierOrderNo, 1117103907
Line : 33048
Date : 17/07/2016
Time : 13:26:45
Type : AddAutoPurchHdr
Description : Could not save PurchHdr record - The supplier order number has already been used in Delivery Note No.1117103907 (Order No.1117103907), Supplier SupplierName(51)
Line : 33049
Date : 17/07/2016
Time : 13:26:45
Type : ImportASN
Description : ConvertASNFiles: Failed to import GRN1171_0000700384_1117103907.xml. Could not save PurchHdr record - The supplier order number has already been used in Delivery Note
No.1117103907 (Order No.1117103907), Supplier SupplierName(51)
Regex:
Line\s+(\d+):\s+([^;]+);([^;]+);([^;]+);(.+)
Небольшое исправление к очень хорошему ответу Мартина. Конструкция [PSCustomObject] не будет работать на хосте powershell v2.
$content = Get-Content 'your_log_path' -raw
$regex = 'Line\s+(\d+):\s+([^;]+);([^;]+);([^;]+);(.+)'
[regex]::Matches($content, $regex) | ForEach-Object {
$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name Line -Value $_.Groups[1].Value
$obj | Add-Member -MemberType NoteProperty -Name Date -Value $_.Groups[2].Value
$obj | Add-Member -MemberType NoteProperty -Name Time -Value $_.Groups[3].Value
$obj | Add-Member -MemberType NoteProperty -Name Type -Value $_.Groups[4].Value
$obj | Add-Member -MemberType NoteProperty -Name Description -Value $_.Groups[5].Value
$obj
}
Используйте группы захвата Regex с именами, чтобы создать ключи хеш-таблицы для настраиваемого объекта:
Get-Content log.txt | ForEach {
$_ -match '^Line (?<Line>\d+): (?<Day>..)/(?<Month>..)/(?<Year>....);(?<Time>.*?);(?<Type>.*?);(?<Message>.*)$'
# Cast date and line to useful types (optional)
$Matches['Date'] = Get-Date ($Matches['Year']+'-'+$Matches['Month']+'-'+$Matches['Day']+' '+$Matches['Time'])
$Matches['Line'] = [int]$Matches['Line']
New-Object -Type PSCustomObject -Property $Matches
}