2011-02-17 44 views
1

快速之一: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) 

回答

3

您對Split()呼叫是使用C#約定逃避t到指定一個製表符。在PowerShell中,您使用單個反引號,例如$_.Split("`t")。此外-match是這樣的一個陣列上不同表現了一點,所以有它在每個單獨的字符串操作,像這樣:

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

還有這裏還與獲取內容一種隱藏的伎倆,在那裏你可以得到它來拆分你:

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

更新:基於更新後的問題,嘗試這樣的:在腦海

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

牢記這數組是基於0 PowerSh埃爾。如果文本已經處於PowerShell/.NET所理解的日期時間格式中,您可以將其轉換爲DateTime,如[DateTime]$cols[1]

+0

感謝您的答覆!問題是,我的問題可能是錯誤的:-)我有行由3列組成,$ pattern匹配第三列,但我想返回該行的第二列的Get-Date。我應該怎麼做? – seminolas 2011-02-17 15:19:32

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") 
+0

@seminolas Get-Date $ matches [1],如果$ pattern是「`t(。+)`t。* code」,則返回第三個字段中包含單詞「code」的行的日期字段。 (`t意味着選項卡)。 – tiago2014 2011-02-17 15:35:59