我正在尝试读取日志文件,以检查报告是否已成功发送给用户,但我在使用Powershell正则表达式时遇到的问题很少,以搜索具有多行的内容。
--- sample.txt的
28/07/17 11:06.31: MailOut: To=test1@mail.com; Subject=PB Outstanding Training;
28/07/17 11:07.05: MailOut: To=test1@mail.com, test2@mail.com,
test3@mail.com; From=mc@mail.com; Subject=NED Pending Training;
28/07/17 11:08.51: MailOut: To=test1@mail.com,
test2@mail.com, test3@mail.com, test4@mail.com, test5@mail.com,
test6@mail.com; From=mc@mail.com; Subject=PIR Number Sequencing;
在上面的示例中,我能够匹配所需的文本,因为它位于同一行,但如果该行被分成两行或更多,那么我就遇到了困难。
---这是我的powershell脚本
$mailLogFile = Get-Content 'mail.log'
$mailLogFile -match "(28)/(07)/(\d+)(\s+)(\d+):(\d+)\.(\d+):(\s+)(.+)PB Outstanding Training"
以上脚本适用于第一行" sample.txt "。如果我更换搜索字符串' PB杰出培训'与 NED等待培训'它对我不起作用。
我尝试在搜索字符串之前附加这些字符
(.\n)+(.\r+)(.\s+)(.t+)
但它也无效。
感谢任何帮助。不确定我在这里缺少什么
答案 0 :(得分:0)
Get-Content
返回一个对象列表。您必须遍历该集合并在每一行上使用-match
。
MSDN在Get-Content
MSDN Get-Content
Get-Content cmdlet获取路径指定位置处项目的内容,例如文件中的文本。它一次读取一行内容并返回一组对象,每个对象代表一行内容。
从Windows PowerShell 3.0开始,此cmdlet也可以获得 从项目的开头或结尾开始的指定行数。
答案 1 :(得分:0)
在上面的例子中,我简单地用“NED Pending Training”取代了“PB Outstanding Training” 例如:
$mailLogFile -match "(28)/(07)/(\d+)(\s+)(\d+):(\d+)\.(\d+):(\s+)(.+)NED Pending Training"
这似乎工作得很好。
想想我会选择字符串路由。 例如:
$MailLogFile | Select-String -Pattern "Ned Pending Training"
答案 2 :(得分:0)
我假设您需要输出与搜索主题相关的所有行。
@'
28/07/17 11:06.31: MailOut: To=test1@mail.com; Subject=PB Outstanding Training;
28/07/17 11:07.05: MailOut: To=test1@mail.com, test2@mail.com,
test3@mail.com; From=mc@mail.com; Subject=NED Pending Training;
28/07/17 11:08.51: MailOut: To=test1@mail.com,
test2@mail.com, test3@mail.com, test4@mail.com, test5@mail.com,
test6@mail.com; From=mc@mail.com; Subject=PIR Number Sequencing;
'@ | Set-Content sample.txt
$lines = Get-Content sample.txt
$patdate = '28/07'
$patsubj = '(?:NED|PB)'
$s = ''
$lines | ForEach-Object {
if( $_ -match "$patdate.+$patsubj" ) { $_; $s = '' }
elseif( $_ -match "$patdate" ) { $s = $_ }
elseif( $s -ne '' ) {
if( $_ -match "$patsubj" ) { "$s`n$_"; $s = '' }
else { $s = "$s`n$_" }
}
}
你可以try it online。