Powershell 多行模式匹配和选择那些行

Powershell multiline pattern matching and picking those lines

我正在尝试根据多行匹配从日志文件中挑选行。我们如何使用 Powershell 实现这一目标?

日志文件:

Date: 2020-05-06 2:30:33 PM 
   Name: ABC.txt
{text} 
{text} 
{text} 
Date: 2020-04-08 3:30:33 PM 
   Name: PQR.txt 
{text} 

我尝试匹配的模式是:

Date: 
   Name:

我想用这个模式拉所有的线。我尝试了以下行,但它不起作用。

get-content $log_file | select-string  -pattern "(?ms)Date:.*\nName:.*" -AllMatches

我正在寻找的输出是:

Date: 2020-05-06 2:30:33 PM 
   Name: ABC.txt 
Date: 2020-04-08 3:30:33 PM 
    Name: PQR.txt

在此之后我想创建一个数组或表格格式数据(首选)作为:

Date|Name 
2020-05-06 2:30:33 PM|ABC.txt
2020-04-08 3:30:33 PM|PQR.txt

感谢大家的支持!!!

您可以执行以下操作:

Get-Content $log_file -Raw |
    Select-String -Pattern '(?m)^Date:.*\r?\n\s*Name:.*' -AllMatches |
        Foreach-Object { $_.Matches.Value }

您应该在 Get-Content 上使用 -Raw 开关将文件内容作为单个字符串传递。否则它是一个字符串数组。使用 single-line 修饰符 (?s),使 . 匹配换行符。由于您只想遍历两条连续的线,我会选择只显式匹配 \r\n,而不使用 single-line 修饰符。然后你可以使用 .* 而不用担心它匹配超出当前行。

由于 Select-String return 是产生匹配的整个字符串,您将需要 return MatchInfo 对象的 属性 Matches 及其 属性 Value 以仅显示匹配的文本。