从日志文件中搜索和分组
Search and group from logfile
我有一个包含很多条目的日志文件。有些以日期开头,有些则没有。
我想搜索 this/last 个月的所有条目
"UpgradeResource] part: 3-V12345678-12-"
行并计算按框分组的结果。
实际上有 9 个盒子,从 1 数到 9,但如果我们再买一个盒子,就会有 10 或 11……盒子计数器总是在行尾跟 -1。
我搜索的行如下所示:
2016-04-27 11:49:43,895 INFO [ajp-apr-8009-exec-9] [com.xxx.shared.yyy.UpgradeResource] part: 3-V12345678-12-5-245, box: 3-V12345678-38-3-1
...
2016-04-27 11:49:43,895 INFO [ajp-apr-8009-exec-9][com.xxx.shared.yyy.UpgradeResource] part: 3-V12345678-12-4-112, box: 3-V12345678-38-1-1
我的结果输出应该是:
Month 03/2016:
Box 1: 10 times
Box 2: 123 times
Box 3: 65 times
Month 04/2016:
Box 1: 75 times
Box 2: 13 times
Box 3: 147 times
我对powershell的使用不是很坚定,试过这个但是出现错误,我认为我的方法不对:
$inputfile = "C:\temp\result.txt"
$matchstring = "(?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*UpgradeResource] part: 3-V12345678-12-(?.*?), box: 3-V12345678-38-(\d{1})-1"
Get-Content $inputfile | foreach {
if ($_ -match $matchstring) {
"" | select @{n='Date';e={$matches.date}},@{n='Key';e={$matches.Key}},@{n='PD';e={$matches.PD}}
}
}
我得到的错误:
"(?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*UpgradeResource] part:
3-V12345678-12-(?.*?), box: 3-V1001686-38-(\d{1})-1" wird analysiert -
Unbekanntes Gruppierungskonstrukt.
In C:\temp\count.ps1:16 Zeichen:6
+ if ($_ -match $matchstring)
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException
合身吗?
$inputfile = "C:\temp\result.txt"
$matchstring = "(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*UpgradeResource] part: 3-V12345678-12-(.*), box: 3-V12345678-38-(\d{1})-1"
Get-Content $inputfile | foreach {
if ($_ -match $matchstring) {
"" | select @{n='Date';e={$matches.1}},@{n='Key';e={$matches.2}},@{n='PD';e={$matches.3}}
}
}
给我输出:
Date Key PD
---- --- --
2016-04-27 11:49:43 5-245 3
2016-04-27 11:49:43 4-112 1
您收到的错误是因为 (?...)
不是有效的分组结构。如果你想使用命名组(你的代码的其余部分建议),问号后面必须跟在 angular 方括号 ((?<name>...)
) 中的组名。对于非捕获组,它后面必须跟一个冒号 ((?:...)
).
有关详细信息,请参阅 here。
您的代码可能看起来像这样:
$inputfile = 'C:\temp\result.txt'
$matchstring = '(?<date>\d{4}-\d{2}-\d{2}) (?<time>\d{2}:\d{2}:\d{2})' +
'.*UpgradeResource] ' +
'part: 3-V12345678-12-(?<Key>.*?), ' +
'box: 3-V12345678-38-(?<PD>\d{1})-1'
Get-Content $inputfile | Where-Object {
$_ -match $matchstring
} | ForEach-Object {
New-Object -Type PSObject -Property @{
'Date' = $matches.date
'Time' = $matches.time
'Key' = $matches.Key
'Box' = 'Box ' + $matches.PD
}
} | Group-Object Date, Box
我有一个包含很多条目的日志文件。有些以日期开头,有些则没有。
我想搜索 this/last 个月的所有条目
"UpgradeResource] part: 3-V12345678-12-"
行并计算按框分组的结果。
实际上有 9 个盒子,从 1 数到 9,但如果我们再买一个盒子,就会有 10 或 11……盒子计数器总是在行尾跟 -1。
我搜索的行如下所示:
2016-04-27 11:49:43,895 INFO [ajp-apr-8009-exec-9] [com.xxx.shared.yyy.UpgradeResource] part: 3-V12345678-12-5-245, box: 3-V12345678-38-3-1 ... 2016-04-27 11:49:43,895 INFO [ajp-apr-8009-exec-9][com.xxx.shared.yyy.UpgradeResource] part: 3-V12345678-12-4-112, box: 3-V12345678-38-1-1
我的结果输出应该是:
Month 03/2016: Box 1: 10 times Box 2: 123 times Box 3: 65 times Month 04/2016: Box 1: 75 times Box 2: 13 times Box 3: 147 times
我对powershell的使用不是很坚定,试过这个但是出现错误,我认为我的方法不对:
$inputfile = "C:\temp\result.txt"
$matchstring = "(?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*UpgradeResource] part: 3-V12345678-12-(?.*?), box: 3-V12345678-38-(\d{1})-1"
Get-Content $inputfile | foreach {
if ($_ -match $matchstring) {
"" | select @{n='Date';e={$matches.date}},@{n='Key';e={$matches.Key}},@{n='PD';e={$matches.PD}}
}
}
我得到的错误:
"(?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*UpgradeResource] part: 3-V12345678-12-(?.*?), box: 3-V1001686-38-(\d{1})-1" wird analysiert - Unbekanntes Gruppierungskonstrukt. In C:\temp\count.ps1:16 Zeichen:6 + if ($_ -match $matchstring) + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], ArgumentException + FullyQualifiedErrorId : System.ArgumentException
合身吗?
$inputfile = "C:\temp\result.txt"
$matchstring = "(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*UpgradeResource] part: 3-V12345678-12-(.*), box: 3-V12345678-38-(\d{1})-1"
Get-Content $inputfile | foreach {
if ($_ -match $matchstring) {
"" | select @{n='Date';e={$matches.1}},@{n='Key';e={$matches.2}},@{n='PD';e={$matches.3}}
}
}
给我输出:
Date Key PD
---- --- --
2016-04-27 11:49:43 5-245 3
2016-04-27 11:49:43 4-112 1
您收到的错误是因为 (?...)
不是有效的分组结构。如果你想使用命名组(你的代码的其余部分建议),问号后面必须跟在 angular 方括号 ((?<name>...)
) 中的组名。对于非捕获组,它后面必须跟一个冒号 ((?:...)
).
有关详细信息,请参阅 here。
您的代码可能看起来像这样:
$inputfile = 'C:\temp\result.txt'
$matchstring = '(?<date>\d{4}-\d{2}-\d{2}) (?<time>\d{2}:\d{2}:\d{2})' +
'.*UpgradeResource] ' +
'part: 3-V12345678-12-(?<Key>.*?), ' +
'box: 3-V12345678-38-(?<PD>\d{1})-1'
Get-Content $inputfile | Where-Object {
$_ -match $matchstring
} | ForEach-Object {
New-Object -Type PSObject -Property @{
'Date' = $matches.date
'Time' = $matches.time
'Key' = $matches.Key
'Box' = 'Box ' + $matches.PD
}
} | Group-Object Date, Box