从日志文件中搜索和分组

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