Как использовать PowerShell select-string, чтобы найти более одного шаблона в файле? - PullRequest
24 голосов
/ 13 октября 2010

Я хотел бы найти более одной строки в файлах в каталоге, однако использование "select-string -pattern" не помогло.Может ли кто-нибудь показать мне, как это сделать?

Пример: Поиск всех файлов в C: \ Logs, которые содержат слова "VendorEnquiry" и "Failed", и с временем ожидания около 11:30 утраСтруктура файлов может отличаться (например, разные имена тегов и т. Д.):

... <methodException>VendorEnquiry</methodException> ...
... <logTime>13/10/2010T11:30:04 am</logTime> ...
... <status>Failed</status> ...

... <serviceMethodException>VendorEnquiry</serviceMethodException> ...
... <logTime>13/10/2010</logTime> ...
... <serviceStatus>Failed</serviceStatus> ...

Спасибо.

Ответы [ 3 ]

27 голосов
/ 07 января 2011

Если вы хотите сопоставить два слова в любом порядке, используйте:

gci C:\Logs| select-string -pattern '(VendorEnquiry.*Failed)|(Failed.*VendorEnquiry)'

Если Failed всегда идет после VendorEnquiry в строке, просто используйте:

gci C:\Logs| select-string -pattern '(VendorEnquiry.*Failed)'
24 голосов
/ 16 октября 2011

Чтобы найти несколько совпадений в каждом файле, мы можем упорядочить несколько вызовов Select-String:

Get-ChildItem C:\Logs |
  where { $_ | Select-String -Pattern 'VendorEnquiry' } |
  where { $_ | Select-String -Pattern 'Failed' } |
  ...

На каждом шаге файлы, которые не содержат текущий шаблон, будут отфильтровываться, гарантируя, что окончательный список файлов содержит все условия поиска.

Вместо того чтобы записывать каждый вызов Select-String вручную, мы можем упростить это с помощью фильтра для соответствия нескольким шаблонам:

filter MultiSelect-String( [string[]]$Patterns ) {
  # Check the current item against all patterns.
  foreach( $Pattern in $Patterns ) {
    # If one of the patterns does not match, skip the item.
    $matched = @($_ | Select-String -Pattern $Pattern)
    if( -not $matched ) {
      return
    }
  }

  # If all patterns matched, pass the item through.
  $_
}

Get-ChildItem C:\Logs | MultiSelect-String 'VendorEnquiry','Failed',...


Теперь, чтобы удовлетворить «Logtime около 11:30 am», часть примера потребовала бы найти время регистрации, соответствующее каждой записи об ошибке. Как это сделать, сильно зависит от фактической структуры файлов, но тестирование на предмет «примерно» относительно просто:

function AboutTime( [DateTime]$time, [DateTime]$target, [TimeSpan]$epsilon ) {
  $time -le ($target + $epsilon) -and $time -ge ($target - $epsilon)
}

PS> $epsilon = [TimeSpan]::FromMinutes(5)
PS> $target = [DateTime]'11:30am'
PS> AboutTime '11:00am' $target $epsilon
False
PS> AboutTime '11:28am' $target $epsilon
True
PS> AboutTime '11:35am' $target $epsilon
True
0 голосов
/ 23 июля 2018
select-string VendorEnquiry,Failed C:\Logs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...