регулярные выражения powershell - PullRequest
1 голос
/ 17 февраля 2011

быстрый:

$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 ]

3 голосов
/ 17 февраля 2011

Ваш вызов 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]}}

Помните, что массивы основаны на 0 в PowerShell. Если текст уже в формате DateTime, который понимают PowerShell / .NET, вы можете просто преобразовать его в DateTime, например [DateTime]$cols[1].

2 голосов
/ 17 февраля 2011

$_.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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...