【问题标题】:Powershell Regular Expression for matching text with new lines用于将文本与新行匹配的 Powershell 正则表达式
【发布时间】:2017-07-28 15:44:37
【问题描述】:

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

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

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    Get-Content 返回一个对象列表。您必须遍历集合并在每一行使用您的 -match

    MSDN 有一些关于 Get-Content MSDN Get-Content 的信息

    Get-Content cmdlet 在路径指定的位置获取项目的内容,例如文件中的文本。它一次读取一行内容并返回一个对象集合,每个对象代表一行内容。

    从 Windows PowerShell 3.0 开始,此 cmdlet 还可以获取 从项目的开头或结尾开始的指定行数。

    【讨论】:

      【解决方案2】:

      在您上面的示例中,我只是将“PB 杰出培训”替换为“NED 待定培训” 示例:

       $mailLogFile -match "(28)/(07)/(\d+)(\s+)(\d+):(\d+)\.(\d+):(\s+)(.+)NED Pending Training"
      

      这似乎工作得很好。

      我想我会走选择字符串路线。 示例:

      $MailLogFile | Select-String -Pattern "Ned Pending Training"
      

      【讨论】:

        【解决方案3】:

        我假设您需要输出与搜索主题相关的所有行。

        @'
        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-14
          • 2016-02-16
          • 2021-12-07
          • 2016-04-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多