2012-05-23 36 views
1

我想執行一些日誌分析。下面列出的示例日誌文件。我知道如何解決程序/腳本這個問題,但我不知道它如何能在「PowerShell的風格」來完成與管道等具有動態上下文參數值的選擇字符串

日誌文件包含字符串的文件名和組件的列表。他們每個人都可以'通過'或'失敗'。我想打印所有以'Checking'開頭的行,它至少有一個FAILED組件。


Checking : C:\TFS\Datavarehus\Main\ETL\SSIS\DVH Project\APL_STG1_Daglig_Master.dtsx 

Checking : C:\TFS\Datavarehus\Main\ETL\SSIS\DVH Project\COPY_STG1_APL_Dekningsgrupper_Z1.dtsx 
    SQLCommand [Z1 APL_Dekningsgrupper] FAILED the VA1 check (table name as source) 
    SQLCommand [APL_Dekningsgrupper] passed the VA1 check 
    SQLCommand [FAK_Avkastningsgaranti_Kollektiv] FAILED the VA1 check (table name as source) 

Checking : C:\TFS\Datavarehus\Main\ETL\SSIS\DVH Project\DM_DVH_BpBedrift_InvesterteFond 1.dtsx 
    SQLCommand [DVH] passed the VA1 check 
    SQLCommand [Avtale Kurs] passed the VA1 check 

在驟眼看上去就像我需要類似

gc logtxt | select-string -pattern 'FAILED' -context <nearest line starting with "Checking" in begining direction>,<lines count from CheckingLine to "LineWith 'FAILED'"> 
+1

有每一個之間的空行「檢查」 -entry還是你把空行那裏只是爲了有更清晰的代碼? –

回答

2

一些粗版本:

$line = $null 
gc test.txt | %{ 
    if($line){ 
     if($_ -match "FAILED"){ 
      $line 
      $line = $null 
     } 
    } 
    if($_ -match "^Checking"){ 
     $line = $_ 
    } 
} 
0

感謝提示。最後我得到了下面的工作代碼:

gc test.txt | Foreach { 
    if ($_.StartsWith('Checking')) { 
     $pkname = $_ 
    } 
    if ($_.Contains('FAILED')) { 
     if (!($pkname.equals($printed_pkname))) { 
     $pkname; 
     $printed_pkname=$pkname} 
     $_ } 
    }