【问题标题】:Select-String -Context and find email address in dataSelect-String -Context 并在数据中查找电子邮件地址
【发布时间】:2016-12-23 14:57:04
【问题描述】:

我有一个文本文件,其中该数据的变体(“SVC”之后的数字和之前的日期,以及文本正文)会出现多次。我可以捕获数据字符串,但是一旦捕获,我需要在该数据中找到一个电子邮件地址。电子邮件可能出现在上下文中的任何第 4 行到第 9 行。我似乎无法弄清楚如何隔离数据并将其设置为变量以便可以捕获它。

Select-String $WLDir -pattern '(\d{2}:\d{2}) - (\d{2}:\d{2})(PMT[S|T]\d{8})' -Context 0,9 | ForEach-Object {
        $StartTime=[datetime]::ParseExact($_.Matches.Groups[1].Value,"HH:mm",$null)
        $EndTime=[datetime]::ParseExact($_.Matches.Groups[2].Value,"HH:mm",$null)
        $ElapsedTime = (NEW-TIMESPAN –Start $StartTime –End $EndTime).TotalHours
        $Email = Select-String $_. -pattern '(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)'
    [PSCustomObject]@{
        SO = $_.Matches.Groups[3].Value
        Topic = $_.Context.PostContext[0]
        Status = $_.Context.PostContext[1]
        ElapsedHrs = $ElapsedTime
        Email = $Email
    }
} | Export-Csv $ExportCsv -NoTypeInformation

我的示例文件是这样的:

  09:45 - 10:15SVC1234567 | Sev8 |437257 | COMPANY | Due: 12/28/2016
  WORK TITLE
  - - Preferred Customer (Y/N): Y Phone: 000-000-0000 ANY Hardware (Y/N): N 
  DATA on file (Y/N/NA): Y Contact: Person Name Full Address: 1234 PANTS 
  XING, RM/STE 100,NEWARK, NJ, 00000 - Hours: 8-5 Issue: Install admin 
  and others Fax Number: NA (required for all cases sent to LOCATION or 
  LOCATION_EXCPT Provider Groups) E-Mail address: email@location.com the 
  customer speak English? yes Escalation Approved By (Name/ID): Guy 
  aljdfs ITEM Product: PRODUCTNAME Group:THIS ONE Include 
  detailed notes below, including reason for severity: SCHEDULED WORK 
  ------------------------------ NOTES: -Cx requesting a tech on site -Cx 
  wants to install WS and wants to be assisted in other concerns

我尝试使用$Email = Select-String $_. -pattern '(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)'$Email = Select-String $_.WLDir -pattern '(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)'$Email = Select-String $_.Context -pattern '(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)' 在上下文中捕获电子邮件,但不知道如何回调上下文以搜索电子邮件地址。我也很有可能做错了。有谁知道我如何捕获它并将其设置为变量?

【问题讨论】:

  • $_.Context.PostContext
  • @MathiasR.Jessen 我没有收到错误,但我的 export.csv 显示“电子邮件”的空白列。 $Email = Select-String $_.Context.PostContext -pattern '(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)' 是正确的语法吗?该正则表达式查找电子邮件地址有问题吗?
  • $Email 是匹配对象而不是字符串。假设它正在返回您需要首先提取值的东西。就像你对第一个选择字符串所做的那样。正则表达式中的括号将组成一个此处不需要的组。
  • @Matt 我只是在我的 CSV 中得到空白字段,所以我不确定。我得到四个“真实”的陈述。这个声明是建立在 MathiasR.Jessen 的声明之上的吗?我尝试了 Mathias 所说的 CSV 上的电子邮件字段为 Email = $Email.Matches.Groups[1] 并轰炸了整个工作(返回空白文档),所以我没有掌握这一点。
  • @Matt 我已经有一段时间了。我不知道如何获得价值。你能帮忙吗?我有没有机会说服你复制代码和示例并运行它,看看我做错了什么?

标签: powershell variables select-string


【解决方案1】:

试试这个:

$content = gc -path $path -Raw | Out-String
$regex1 = [regex]"\w+@\w+.\w+"
$regex2=[regex]"(?ms)(\d{2}:\d{2}) - (\d{2}:\d{2})(\D+)(\d+)(.*)"
$content | Select-String -pattern $regex2 | %{
$startTime = [datetime]::ParseExact(($regex2.Matches($content) | %{$_.Groups[1].Value}),"HH:mm",$null) 
$endTime = [datetime]::ParseExact(($regex2.Matches($content) | %{$_.Groups[2].Value}),"HH:mm",$null) 
$elapsedTime = (NEW-TIMESPAN –Start $startTime –End $endTime).TotalHours
$code = "PMT" + ($_.Matches.Groups[4].value) 
$remainingString = $_.Matches.Groups[5].Value
$topic = $remainingString.split("`n")[1] 
$status = $remainingString.split("`n")[2] 
$email = $regex1.Matches($remainingString).Value    

[PSCustomObject]@{
        SO = $code
        Topic = $topic
        Status = $status
        ElapsedHrs = $elapsedTime
        Email = $email
    }
} | Export-Csv "res.csv" -NoTypeInformation

【讨论】:

  • 这整件事已经发生在ForEach 中。如果我返回并获取整个文件的内容,而不仅仅是选定的字符串,我将不会提取正确的电子邮件地址。
  • for-each 是为了让您找到任何电子邮件的多个实例,其想法是使用正则表达式对象。否则试试这个: $_ |选择字符串 $regex -AllMatches | %{$_.matches} | %{$_.Value}
  • 喜欢这个? $regex = [regex]"\w+[a-zA-Z0-9]@\w+[a-zA-Z0-9].\w+"$Email = $_ | Select-String $regex -AllMatches | %{$_.matches} | %{$_.Value}?我将它放在主要Select-String 下的变量列表中(就在$ElapsedTime 下方)。如果是这种情况,它不会返回任何内容。
  • 从文本中,您想在 SO、Topic 和 Status 中捕获什么?
  • 如果您查看代码,我将 SO 捕获为 (PMT[S|T]\d{8}),这是一个服务订单“PMT”,然后是“S”或“ T" 后跟 8 位数字。 Topic 是它找到 PMT 信息的行下的一个特定上下文行,Status 是另一行,ElapsedHrs 是对之前两次正则表达式捕获的计算。在第 4 行和第 9 行之间的某处,将显示一个电子邮件地址。我正在尝试捕获该电子邮件地址并将其与电子邮件标题下的其他信息一起放在 CSV 中。
【解决方案2】:

因为我从来没有找到准确的方法来捕获这些信息,所以我决定将帖子上下文中的所有 0-9 行捕获到状态中。在 Excel 工作表上,我使用来自=IF(O6="","",TRIM(RIGHT(SUBSTITUTE(LEFT(O6,FIND(" ",O6&" ",FIND("@",O6))-1)," ",REPT(" ",LEN(O6))),LEN(O6))))this page 的计算将数据从“O”列拉到电子邮件所属的“Q”列。感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2018-03-15
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多