Powershell:使用 Select-String 从目录中的每个文件中获取第一个匹配项

问题描述 投票:0回答:2

使用 PowerShell,我需要从目录中的每个(文本)文件中获取匹配项的第一个实例。

文件的相关部分如下所示:

TANK PRODUCT VOLUME TC-VOLUME ULLAGE HEIGHT WATER TEMP

1 无铅 2275 0 7606 34.83 0.00 70.12

在文件的更下方,有更多“无铅”一词的实例,但我需要从这一行获取音量(在本例中为 2275)。

这个脚本: $u_line = (Select-String -Path ".\TMUSite_*.sav" -Pattern "Unleaded" | Select-Object * -First 1).Line 让我: 1 无铅 2275 0 7606 34.83 0.00 70.12

...这很好,因为我可以使用 [regex]::matches 或其他方式从那里提取数字。问题是目录中大约有 10 个文件,我需要从所有文件中获取这个值。现在我只从第一个文件中得到匹配项。

我期待得到一系列类似于上面的行。我认为“-First 1”让我获得了第一场比赛,并且每个文件都会发生这种情况。使用 Select-String 的好处是它返回的对象,因为它包含文件名,其中有一个 ID,我必须将提取的值绑定到它,可能在 PSCustomObject 中。但是现在我只能得到第一行。

powershell text-files select-string
2个回答
2
投票

我以为“-First 1”让我得到了第一场比赛,并且每个文件都会发生这种情况。

  • 不,它只获取第一个输出对象overall,跨越所有文件。

  • 另请注意,您不需要

    Select-Object *
    (缩写:
    Select-Object -Property *
    -First
    ;事实上,如果您这样做,您将不必要地创建Select-String的输出对象的
    副本

相反,使用

Select-String
-List
开关将输出限制为一个匹配每个文件.

Select-String -List -Path ".\TMUSite_*.sav" -Pattern "Unleaded"

0
投票

为每个文件选择第一个(尽管

-List
更好!):

$Unleaded = (Get-Item -Path ".\TMUSite_*.sav" | foreach { 
  Select-String -path $_ -Pattern "Unleaded" | Select-Object -First 1 
})

从那里,您可以访问

$unleaded.Line
的文本,以及
$Unleaded.Filename
.Path
的文本。您的原始示例使用了
$u_line = (...).Line
,因此它丢弃了其他属性

© www.soinside.com 2019 - 2024. All rights reserved.