如何解决Powershell多行模式匹配和选择那些行
我正在尝试基于多行匹配从日志文件中选择行。我们如何使用Powershell实现这一目标?
LogFile:
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 }
您应该使用-Raw
上的Get-Content
开关将文件内容作为单个字符串传递。否则,它是一个字符串数组。使用单行修饰符(?s)
,可使.
匹配换行符。由于您只想遍历两条连续的线,因此我选择仅显式地匹配\r
和\n
而不使用单行修饰符。然后,您可以使用.*
,而不必担心超出当前行的情况。
由于Select-String
返回产生匹配项的整个字符串,因此您需要返回MatchInfo
对象的属性Matches
及其属性Value
,以仅显示匹配的文本
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。