仅使用 powershell 查找字符串的最后一个匹配项

ebo*_*225 4 powershell

我正在尝试使用 powershell 查看特定字符串的日志文件,并且只将它的最后一个实例返回到一个变量中以供以后使用。

日志示例:

09/07/17 13:27:19.858 TCP/IP Terminal.GetVersionInfo AppVersion         [RA 4.0.560]
09/07/17 13:27:19.858 TCP/IP Terminal.GetVersionInfo OSVersion          [L5x-OS-v00.00-20170000-0]
09/07/17 13:27:19.858 TCP/IP Terminal.GetVersionInfo PackingListVersion [0001]
09/07/17 13:27:19.858 TCP/IP Terminal.GetVersionInfo TerminalName       [LXXXX_PCI3]
09/07/17 16:28:17.300 TCP/IP Terminal.GetVersionInfo AppVersion         [RA 4.0.561]
Run Code Online (Sandbox Code Playgroud)

只是 AppVersion 的最后一个结果是我想要返回的:

[RA 4.0.561]

编辑:

我试图遍历每一行并将结果放入一个数组中,但该数组给了我奇怪的结果:

$results = @()
foreach ($line in $logfile) {
    $hits = [regex]::match($line,'\[RA.\d.*]')
    $results += $hits.Value
}
$results
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 5

LotPings 的回答很有希望,但有一种更简单的方法可以做到,而无需辅助。多变的:

Select-String ' AppVersion\s+(\[.+?\])' $logfile | 
  Select-Object -Last 1 |
    ForEach-Object { $_.Matches[0].Groups[1].Value }
Run Code Online (Sandbox Code Playgroud)

鉴于根据定义最多只有 1 场比赛,我们也可以这样做:

(Select-String ' AppVersion\s+(\[.+?\])' $logfile | Select-Object -Last 1).
  Matches[0].Groups[1].Value
Run Code Online (Sandbox Code Playgroud)

如果在选择最后一个之前先收集内存中的所有匹配项是可行的:

(Select-String ' AppVersion\s+(\[.+?\])' $logfile)[-1].Matches[0].Groups[1].Value
Run Code Online (Sandbox Code Playgroud)