2011-12-11 3 views
4

일부 대용량 텍스트 파일에서 데이터 집합을 추출하려고합니다. 내가 날짜와 괄호 사이의 비트 (프로세스 ID)를 얻고, 다음 테이블을 컴파일하고 싶습니다powershell 정규식 가져 오기 테이블에

2011-12-09 18:20:55, ABC.EXE[3b78], The rest of the line... 

: 기본적으로, 각 라인은 다음과 같이 보인다. 이 태스크의 두 번째 단계는이 테이블을 그룹화하여 각 프로세스 ID에 대한 가장 빠른 날짜를 얻고, 실제로 프로세스 ID 당 첫 번째 로그 항목의 날짜와 시간을 제공하여 해당 인스턴스의 시작 시간에 근사하게 맞춰야한다 프로세스의

내가 지금까지있어 무엇

gci -filter *.log -r 
| select-string '(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}), ABC.EXE\[(.{4})' 
| % { $_.matches } | % { $_.groups } | % { $_.value } 

이 (가) 캡처를 뱉어 (읽기 쉽도록 다른 행으로 분할). 첫 번째 캡처를 무시하고 같은 라인에 두 번째와 세 번째를 결합하고 싶습니다.

도움 말? 주세요.

편집 : DOH! 내 질문에 대답 할 수 없다. 그래서 ...

좋아, 나는 옳은 길에 있다고 생각해. 소위 질문 here 내가 즉, 원하는 개별 부품을 얻기 위해 나에게 도움이 :

$_.matches[0].groups[1].value, $_.matches[0].groups[2].value 

다음에, MSDN 기사 here이 방법을 보여줍니다 수 있습니다 '덩어리'객체에 비트에이를 그룹화 할 수/분류/조작 된. 최종 결과

gci -filter *.log | select-string '(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}), ABC.EXE\[(.{4})' 
| % { new-object object 
    | add-member NoteProperty Name $_.matches[0].groups[1].value -passthru 
    | add-member NoteProperty PId $_.matches[0].groups[2].value -passthru } 

누구나 더 깨끗한 방법을 알고 있다면 알려 주시기 바랍니다. New-Object cmdlet을 속성의 해시 테이블받는 -Property 매개 변수를 지원하는 경우 당신은 PowerShell을 v2를에서 간단하게 새로운 개체를 만들 수 있습니다

답변

4

: 일반적으로

New-Object PSObject -Property @{ 
    Name = $_.matches[0].groups[1].value 
    PId = $_.matches[0].groups[2].value 
} 

을, 그래도 조금 다르게 처리 할 거라고 :

# prepare table 
$data = $(switch -Regex -File filename { 
    '^[^,]+' { $date = [datetime]$Matches[0] } 
    '(?<=\[)[^\]]+' { $id = $Matches[0] } 
    '$' { New-Object PSObject -Property @{ 
     Date = $date 
     PId = $id 
    } } 
}) 

switch -regex을 사용하면 텍스트 데이터에 대해 빠르고 더러운 파서를 수행하는 데 좋은 방법이되었습니다. -Regex을 사용하면 모든 일치 사례가 실행됩니다.이 경우 모두 (일치하는 부분을 구분할 수있는 편의성). 첫 번째는 날짜와 시간을 가져 와서 변수에 저장합니다 (심지어 DateTime 값). 두 번째는 프로세스 ID를 얻고 세 번째는 프로세스의 끝에서 일치시켜 모든 것을 결합합니다.

다만 개인적인 취향, 그래도; 사실 Select-String을 사용한 적이 없습니다.

$data | 
    group PId | 
    foreach { New-Object PSObject -Property @{ 
     PId = $_.Name 
     MinDate = @($_.Group | sort Date)[0].Date 
    } } 

그러면 프로세스가 ID별로 그룹화하고 각 ID가 최소 날짜 인 ID를 출력합니다.

참고 :이 코드는 "코드에서보기 좋게"접근합니다. 상대방의 파일이 이라면 실제로는입니다.

+0

굉장한, 그게 내가 원하는 물건이야!Powershell에서 switch 문을 발견 한 적은 한번도 없었습니다. 나는 그것을 좋아한다. –

+0

'Get-Help about_switch'를 할 수있다. 정말 다목적입니다. – Joey

+0

New-Object의 -Property 스위치는 +1입니다. –

관련 문제