Powershell匹配当前行和下一行,然后输出

时间:2019-01-17 14:41:12

标签: powershell powershell-v4.0

我正在尝试提取数据:

第1行=报表ID +第2行=“机器编号” +第3行=脱机

然后Out-File到一个新文件。

样本数据

Report ID           page1

Machine no  1234    

        OTHERS
            12
        offline
            12
        OTHERS
            23
        offline
            37
        OTHERS
            89
        offline
            65

经过处理后,我正在寻找的结果如下所示:

Report ID           page 4

    Machine no  1234    
        offline
            12
        offline
            37
        offline
            65

1 个答案:

答案 0 :(得分:0)

您可以将Select-String cmdlet与-Context参数一起使用来搜索文件,然后选择要从搜索中获取多少行上下文信息。

例如,如果我们采用您的输入文件并将其存储在名为$input的变量中,如下所示:

$inputFile= Get-Content C:\Path\To\YourFile.txt
$inputFile| Select-string 'machine no'
>Machine no  1234  

然后我们可以找到短语“ offline”的匹配项:

$inputFile| Select-String offline -Context 0,1

这表示我希望您搜索单词“ offline”,并给我零行,然后再一行,给我们以下输出:

>         offline
              12
>         offline
              37
>         offline
              65

我们可以将所有这些放在一起来构建它,并生成一个看起来像这样的新输出文件。

$out= ''
$out += $inputFile| Select-string 'machine no'
$out += "`n"
$out += $inputFile| Select-String offline -Context 0,1 | ForEach-Object {$_.Context.DisplayPostContext}

#Resulting file would look this, just the name of the machine and then the number of each offline...uh, whatever it is.
    Machine no  1234    
        12             37             65

如果我是您,我将改编此流程以制作PowerShell对象和属性,如下所示:

$Report = [pscustomobject]@{ID='';MachineNo='';OfflineMembers=@()}
$Report.ID = ($inputFile | select-string page -Context 0 ).ToString().Split('page')[-1]
$Report.MachineNo = ($inputFile | Select-string 'machine no').ToString().Trim().Split()[-1]
$Report.OfflineMembers = $inputFile | Select-String offline -Context 0,1 | ForEach-Object {
            [pscustomobject]@{Value='Offline';ID=$_.Context.DisplayPostContext.Trim()}
            }

>$Report

ID MachineNo OfflineMembers                                                             
-- --------- --------------                                                             
1 1234      {@{Value=Offline; ID=12}, @{Value=Offline; ID=37}, @{Value=Offline; ID=65}}
 $Report.OfflineMembers
Value   ID
-----   --
Offline 12
Offline 37
Offline 65