source

PowerShell 선택 문자열을 사용하여 파일에서 두 개 이상의 패턴을 찾는 방법은 무엇입니까?

manycodes 2023. 9. 13. 22:50
반응형

PowerShell 선택 문자열을 사용하여 파일에서 두 개 이상의 패턴을 찾는 방법은 무엇입니까?

디렉터리에 있는 파일에 있는 문자열을 두 개 이상 검색하고 싶지만 "select-string-pattern"을 사용하는 것은 도움이 되지 않았습니다.누가 어떻게 하는지 보여줄 수 있습니까?

: "VendorEnquiry" 및 "Failed" 단어가 포함된 C:\Logs 및 오전 11:30 정도의 Log time에서 모든 파일을 검색합니다.파일의 구조가 다를 수 있습니다(예: 태그 이름이 다른 경우 등).

... <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> ...

감사해요.

두 단어를 순서대로 일치시키려면 다음을 사용합니다.

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

VendorQuery 다음에 항상 Failure(실패)가 나타나면 다음을 사용합니다.

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

각 파일에서 여러 일치 항목을 검색하기 위해 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',...


이제, 예제의 "Log time about 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

배열에서 여러 패턴을 지정할 수 있습니다.

select-string VendorEnquiry,Failed C:\Logs

-not match와 함께 작동합니다.

select-string -notmatch VendorEnquiry,Failed C:\Logs

언급URL : https://stackoverflow.com/questions/3920383/how-to-use-powershell-select-string-to-find-more-than-one-pattern-in-a-file

반응형