1

いくつかのログ分析を実行したいと考えています。ログ ファイルの例を以下に示します。プロシージャ/スクリプトでこの問題を解決する方法は知っていますが、パイプラインなどを使用して「powershell スタイル」でどのように実行できるのだろうか

ログ ファイルには、ファイル名とコンポーネントのリストを含む文字列が含まれます。それらのそれぞれは、「合格」または「失敗」することができます。FAILED コンポーネントが少なくとも 1 つある「Checking」で始まるすべての行を印刷したいと考えています。


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'">
4

2 に答える 2

2

粗いバージョン:

$line = $null
gc test.txt | %{ 
    if($line){ 
        if($_ -match "FAILED"){
            $line
            $line = $null
        }
    }
    if($_ -match "^Checking"){
        $line = $_
    } 
}
于 2012-05-23T09:19:31.293 に答える
0

ヒントをありがとう。最後に、次の作業コードを取得しました。

gc test.txt | Foreach {
    if ($_.StartsWith('Checking'))  {
        $pkname = $_
    }
    if ($_.Contains('FAILED')) { 
        if (!($pkname.equals($printed_pkname))) {
        $pkname; 
        $printed_pkname=$pkname} 
        $_ }
    }
于 2012-06-08T07:29:02.277 に答える