powershell正则表达式

时间:2011-02-17 14:58:14

标签: regex powershell

快点:

$logFile="D:\Code\functest\1725.log"
function getTime($pattern) {
  Get-Content $logFile | %{ if ($_.Split('\t') -match $pattern) {$_} }
}
getTime("code")

给了我

simple  17-Feb-2011 10:45:27    Updating source code to revision: 49285
simple  17-Feb-2011 10:54:22    Updated source code to revision: 49285

但如果我从

更改打印值
$_

$matches

我一无所获。我以为这个数组应该是自动创建的?可能是傻事,但这是我使用powershell的第一天: - )

编辑:我想要返回的是

Get-Date (column 2 of the matching line)

2 个答案:

答案 0 :(得分:3)

您对Split()的调用是使用C#约定来转义t以指定制表符。在PowerShell中,您使用单个反引号,例如$_.Split("`t")。同样-match在这样的数组上的行为有点不同,所以它对每个单独的字符串进行操作,如下所示:

Get-Content $logFile | Foreach {$_.Split("`t")} | Where { $_ -match $pattern }

Get-Content还有一些隐藏的技巧,你可以在其中为它分割:

Get-Content $logFile -del "`t" | Where { $_ -match $pattern }

更新:根据更新的问题,尝试以下方式:

gc $logFile | % {$cols = $_.Split("`t"); if ($cols[2] -match $pattern) {$cols[1]}}

请记住,PowerShell中的数组是基于0的。如果文本已经是PowerShell / .NET所理解的DateTime格式,那么您可以将其转换为类似[DateTime]$cols[1]的DateTime。

答案 1 :(得分:2)

$_.Split('\t')打破它。
首先,它打破了每个字母“t”,而不是标签。 其次,它返回一个混淆-match的数组。

使用以下代码:

Get-Content $logFile | %{ if ($_ -match $pattern) { $matches } }

getTime("code")会返回:

Name                           Value                                                                                                                                       
----                           -----                                                                                                                                       
0                              code                                                                                                                                        
0                              code 

这将允许使用正则表达式进行搜索,如

$answerArray = getTime("(\t)(\d+)")
$digitsOfSecondResult = $answerArray[1][2]
Write-Output $digitsOfSecondResult

如果您只想打印与图案匹配的线条,请尝试:

Get-Content $logFile | %{ if ($_ -match $pattern) { $_} }

获取日期:

function getTime($pattern) {
  Get-Content $logFile | %{ if ($_ -match $pattern) { Get-Date $matches[1] } }
}
getTime("`t(.+)`t.*code")

或者:

function getTime($pattern) {
  Get-Content $logFile | %{ if ($_ -match "`t(.+)`t.*$pattern") { Get-Date $matches[1] } }
}
getTime("code")