Powershell正则表达式,用于将文本与新行匹配

时间:2017-07-28 15:44:38

标签: regex powershell

我正在尝试读取日志文件,以检查报告是否已成功发送给用户,但我在使用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+)但它也无效。

感谢任何帮助。不确定我在这里缺少什么

3 个答案:

答案 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