Powershell 多行模式匹配并选取这些行

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

我正在尝试根据多行匹配从日志文件中选取行。我们如何使用 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

感谢大家的支持!!!!

regex powershell multiline
1个回答
4
投票

您可以执行以下操作:

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

您应该使用

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

由于

Select-String
返回产生匹配的整个字符串,因此您需要返回
MatchInfo
对象的属性
Matches
及其属性
Value
以仅显示匹配的文本。

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