$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)
答案 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")