0

我有一个包含许多条目的日志文件。其中一些以日期开头,而另一些则不是。我想在该行中搜索本月/上个月的所有条目 "UpgradeResource] part: 3-V12345678-12-"并计算按框分组的结果。实际上从 1 到 9 有 9 个盒子,但是如果我们再买一个盒子,就会有 10 或 11……盒子计数器总是在行尾跟着 -1。

我搜索的行如下所示:

2016-04-27 11:49:43,895 信息 [ajp-apr-8009-exec-9] [com.xxx.shared.yyy.UpgradeResource] 部分:3-V12345678-12-5-245,框:3-V12345678 -38-3-1
...
2016-04-27 11:49:43,895 信息 [ajp-apr-8009-exec-9][com.xxx.shared.yyy.UpgradeResource] 部分:3-V12345678-12-4-112,框:3-V12345678 -38-1-1

我的结果输出应该是:

2016 年 3 月 03 日:
盒子1:10次
方框2:123次
方框3:65次

04/2016 月:
方框1:75次
盒子2:13次
方框3:147次

我在使用 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] 部分:
3-V12345678-12-(?.*?),方框:3-V1001686-38-(\d{1})-1" 线分析仪 -
Unbekanntes Gruppierungskonstrukt。
在 C:\temp\count.ps1:16 Zeichen:6
+ if ($_ -match $matchstring)
+ ~~~~~~~~~~~~~~~~~~~~~~
     + CategoryInfo : OperationStopped: (:) [], ArgumentException
     + FullyQualifiedErrorId : System.ArgumentException
4

2 回答 2

0

这合适吗?

$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   
于 2016-04-28T09:21:43.523 回答
0

您收到的错误是因为(?...)不是有效的分组构造。如果要使用命名组(代码的其余部分建议使用),问号后面必须跟尖括号 ( (?<name>...)) 中的组名。对于非捕获组,它必须后跟一个冒号 ( (?:...))。

请参阅此处了解更多信息。

您的代码可能看起来像这样:

$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
于 2016-04-28T10:46:57.563 回答