PowerShell使用RegEx拆分字符串

时间:2014-12-09 10:18:06

标签: regex powershell

你能帮帮我吗?

这是我尝试使用 PowerShell 实现的功能 - 使用所需数据(Subject,FromDisplayName,SubmittedDateTime,MessageTrackingReportId)将电子邮件从特定邮箱导出到CSV文件。所以我使用以下四个字符串制作它:

$msg = Search-MessageTrackingReport -Identity MyMailBox -BypassDelegateChecking

#get relevant info from that mailbox and save it to CSV file
$msg | %{ Get-MessageTrackingReport -Identity $_.MessageTrackingReportId -BypassDelegateChecking } | Select Subject, FromDisplayName, SubmittedDateTime, MessageTrackingReportId | Export-CSV C:\MyFile.csv -NoTypeInformation

#import CSV file and get rid of dublicates and select only needed columns
$temp = Import-CSV C:\MyFile.csv | sort MessageTrackingReportId -Unique | Select Subject, FromDisplayName, SubmittedDateTime

#export CSV file
$file = $temp | Export-CSV C:\MyFile.csv -NoTypeInformation

但我面临的问题是,电子邮件主题可能如下所示:

** FAN-CRITICAL Service Alert: LTC-SW-NEX01/fan-status is OK ** (24x7 OOH Alerts)

** SM-CRITICAL Service Alert: PRDDC1FAS001/snapmirror-lagtime is CRITICAL ** (24x7 OOH Alerts)

** RECOVERY Service Alert: PRDDC1ADS001/CPU Load is WARNING ** (24x7 OOH Alerts)

... (Something in similar format)

因此,我需要拆分此字符串,并将Subject列替换为CSV文件中的这四个新列:

  1. AlertType为 - FAN-CRITICAL Service AlertSM-CRITICAL Service AlertRECOVERY Service Alert...

  2. MachineName是 - LTC-SW-NEX01PRDDC1FAS001PRDDC1ADS001...

  3. AlertName是 - fan-statussnapmirror-lagtimeCPU Load...

  4. 状态为 - OKCRITICALWARNING...

  5. 因此,在一天结束时,我的CSV文件应包含以下列:

    • 警告类型
    • 计算机名
    • 警报名称
    • 状态
    • FromDisplayName
    • SubmittedDateTime
    • MessageTrackingReportId

    我知道我需要使用 RegEx ,但我没有任何使用过的经验,所以有人可以帮助我,我该如何结合 PowerShell RegEx 来实现我的目标。

    提前致谢!

3 个答案:

答案 0 :(得分:0)

([\w ]+?):\s*([^\/]+)\/(.*?)\s\w+\s(\w+)\s\*\*

你可以尝试一下。参见demo.Grab捕获。

https://regex101.com/r/iY3eK8/9

答案 1 :(得分:0)

开始时的事情:

$messages = @(
    "** FAN-CRITICAL Service Alert: LTC-SW-NEX01/fan-status is OK ** (24x7 OOH Alerts)",
    "** SM-CRITICAL Service Alert: PRDDC1FAS001/snapmirror-lagtime is CRITICAL ** (24x7 OOH Alerts)",
    "** RECOVERY Service Alert: PRDDC1ADS001/CPU Load is WARNING ** (24x7 OOH Alerts)"
)


$messages | %{

    $_ -match "/*/*\s*(?<AlertType>[\w ]+?):\s*(?<MachineName>[^\/]+)\/(?<AlertName>.*?)\s\w+\s(?<Status>\w+)\s\*\*"  | Out-Null  

    $matches["AlertType"]
    $matches["MachineName"]
    $matches["AlertName"]
    $matches["Status"]
}

有关使用powershell here的正则表达式和捕获组的更多解释。

答案 2 :(得分:0)

试试这个:

$regex = '\*\* (.+?) Service Alert: (.+?)/(.+?) is (.+?) \*\*'

if ($text -match $regex)
  {
   $AlertName,$MachineName,$AlertType,$Status = $Matches[1..4]
  }