2013-01-22 3 views
0

특정 문자열 ("제한 시간 기간")을 검색하고있는 로그가 있습니다. 내 로그에이 인스턴스를 선택하려면 다음을 사용할 수 있습니다Powershell Select-String 일치

Get-Content mylog.txt | select-string 'the timeout period' | select-object 

나는 데 I하면서, 이것이 XML이 파워 쉘은 오류가있는 라인을 따기 파일이라는 것이다 문제 데이터/시간 정보가 정말로 필요합니다. 내가 필요한 것은 '타임 아웃 기간'과 일치하는 라인 인스턴스 바로 전에 "스레드"와 일치하는 라인 인스턴스입니다. 예를 들어 :

Thread 3423 - 6:34:00 
Info following. ..... .... 
Error .... the timeout period 

그래서 내가 출력하고자하는 것입니다 : 파일이 내가 선택-XML과는 XPath 검색 패턴을 사용하여 고려할 XML은

Thread 3423 - 6:34:00 
+0

실제로이 작업은 xml 파일이라고 말할 수 있습니까? 우리가 그 샘플을 얻을 수 있을까요? 데이터가 xml의 여러 요소에서 분리되어 있으면 더 쉽습니다. –

+0

실제로 XML이 아니라는 것을 깨달았습니다. XML을 함께 실행하기 때문에 줄을 필터링하기가 어렵습니다. –

+0

내가 제공 한 답변을 확인하십시오. 작동해야 함;) –

답변

1

정보 부분이 여러 줄로 표시 될 수 있습니다. 그래서 내 시도입니다 :

$content = Get-Content .\test.txt 
$content | select-string "the timeout period" | % { 
    $i = ($_.linenumber -1) 

    while ($content[$i] -notlike "Thread*") { 
     $i-- 
    } 

    $content[$i] 
} 

각 오류에 대해 "스레드"로 시작하는 이전 줄이 표시됩니다. 전의. 출력 :

Thread 3423 - 1:34:00 
Thread 3423 - 2:34:00 
Thread 3423 - 3:34:00 
Thread 3423 - 4:34:00 
+0

이 항목은 중복 된 항목을 만들었습니다. 나는 그 (것)들을 청소하기 위하여 get-unique를 사용했다. 감사! –

1

합니다. 즉, 다음과 같이 Select-String을 사용할 수 있습니다.

Get-Content mylog.txt | select-string "the timeout period" -context 2 | 
    Foreach {$_.Context.PreContext[0]} 
+0

이것은 닫았지만 컨텍스트가 "스레드"행에 도달하지 않는 몇 가지 예제가 있습니다. 모든 스레드 정보를 얻으려면 -Context 5로 다시 밀어 넣어야했습니다.이 방법은 효과가 있지만 정확하지는 않습니다. –