使用powershell从具有已定义变量和额外字符串组合的文件中搜索模式

时间:2013-07-04 10:10:09

标签: regex windows powershell powershell-v2.0 powershell-v3.0

我有一个如下所述的文本文件:

    04Jul@15:08 ERROR: The Ticket and Load data do not match: NUM[MXS035] 
    04Jul@15:14 No data for MXS035
    04Jul@15:14 Ticket = [MXS035]
    04Jul@15:39 Ticket = [ABC077]
    04Jul@16:14 gNoRcomp = [72]
    04Jul@16:14 Test lines 12345
    04Jul@16:14 gNoRcomp = [72]
    04Jul@16:14 test file content not displayed
    MU: module rpt3.cpp, line 8652
    Database 0
    Communications 0

我创建了一个$ date值,使用变量

捕获文本文件04Jul的公共部分的特定日期
    $date_value=Get-date -Format ddMMM

当显示$ date_value的valye时,我们得到04Jul 我需要搜索文本文件中的模式,该模式的日期是通用的,而工作票据是常见的...行中的其余值会发生变化。

示例:

我需要捕捉以下几行:

    04Jul@15:14 Ticket = [MXS035]
    04Jul@15:39 Ticket = [ABC077]

这已经在变量$ date_value @中捕获了04Jul,并且时间字段发生了变化,“Ticket = [”再次变为常见,接下来的6个字符发生了变化而最后一个变为常见而且没有变化。

所以要求是

    $date_value@......Ticket=[......]

上述部分在需要捕获的文本文件行中很常见。

我尝试了以下选择字符串,但无效。

    select-string -pattern "$date_value@\d+:\d+ Ticket = [[]ABCDEF[]]" test.txt

任何建议都有效吗?

3 个答案:

答案 0 :(得分:1)

这是字符串的正则表达式的例子:“04Jul @ 15:14 Ticket = [MXS035]”

"04Jul@15:14 Ticket = [MXS035]" -Match "(\d{2}\w{3})@(\d{2}:\d{2})\sTicket\s=\s\[(\w*)\]"
$date = ($Matches[1] | Get-date -Format ddMMM)
$time = $Matches[2]
$ticket = $Matches[3]
$date, $time, $ticket

此代码将选择与模式匹配的所有字符串

Select-String -Pattern "(\d{2}\w{3})@(\d{2}:\d{2})\sTicket\s=\s\[(\w*)\]" test.txt

日期变量

$date_value='04Jul'
Select-String -Pattern $date_value+"@\d{2}:\d{2}\sTicket\s=\s\[\w*\]" "C:\test.txt"

答案 1 :(得分:1)

在您的模式中,将[[]ABCDEF[]]更改为\[[A-Z]{3}[0-9]{3}\]以匹配由3个大写字母组成的票号,后跟文字方括号之间的3位数字:

$date_value = Get-date -Format ddMMM
Select-String "$date_value@\d+:\d+ Ticket = \[[A-Z]{3}[0-9]{3}\]" test.txt

当我在文件test.txt上使用它时,会给我以下输出,其中包含您问题中的示例内容:

test.txt:3:04Jul@15:14 Ticket = [MXS035]
test.txt:4:04Jul@15:39 Ticket = [ABC077]

答案 2 :(得分:1)

您需要修改正则表达式中正在寻找引用的正则表达式部分。

如果要查找在正则表达式语法中具有特殊含义的字符,则必须首先使用反斜杠字符将其转义,例如:为了逃避一个开放的方括号,它是\ [(实际上输入这个,我必须通过输入两次来逃避反斜杠)

以下作品:

select-string -pattern "$date_value@\d+:\d+ Ticket = \[[A-Za-z]{3}\d{3}\]" test.txt

所以,直到方括号中的引用都完成了。我在这里做的是告诉它寻找一个开口的方括号,然后是3个字母的大写或小写,后跟3个数字,最后是一个结束的方括号。

在我的测试中,使用您提供的内容的文件,我得到了以下结果:

test.txt:3:04Jul@15:14 Ticket = [MXS035]
test.txt:4:04Jul@15:39 Ticket = [ABC077]

...告诉你文件名,匹配的行号和行内容。

要获得进一步的帮助,请在Powershell命令窗口或ISE GUI中输入: help about_regular_expressions