具有动态上下文参数值的select-string

时间:2012-05-23 07:35:34

标签: powershell pipeline

我想执行一些日志分析。下面列出的示例日志文件。我知道如何使用过程/脚本解决这个问题,但我想知道如何使用管道等在'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'">

2 个答案:

答案 0 :(得分:2)

原始版本:

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

答案 1 :(得分:0)

感谢您的提示。最后我得到了以下工作代码:

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