grepの結果をグループ化する方法は?

grepの結果をグループ化する方法は?

カテゴリ別にグループ化された結果を含むファイルがあります。たとえば、

checking results for $var
here are some results1 for $var status ok
here are some results2 for $var status ok
here are some results3 for $var status ok

checking results for $var2
here are some results1 for $var2 status ok

checking results for $var3
here are some results1 for $var3 status ok
here are some results2 for $var3 status ok
here are some results3 for $var3 status critical
here are some results4 for $var3 status ok

特定のカテゴリの行に「重要」ステータスがあることを確認し、その場合は表示する必要があります。たとえば、

Status $var -- OK
Status $var2 -- OK
Status $var3 -- Critical

Note : Critial at $result3 for $var3

grep -A特定の変数による結果の数が異なるため、使用は私には適していません。

答え1

awkは次のことを行います。

awk '
    BEGIN {
        priority["ok"] = 10
        priority["critical"] = 20
    }
    /^$/ {next}
    /^checking/ {var = $NF}
    {
        if (priority[status[var]] < priority[$NF])
            status[var] = $NF
        if ($NF == "critical")
            crit[var ":" $4] = 1
    }
    END {
        for (var in status)
            print var, status[var]
        for (c in crit) {
            split(c, ary, /:/)
            printf("critical at %s for %s\n", ary[2], ary[1])
        }
    }
'

出力

$var ok
$var2 ok
$var3 critical
critical at results3 for $var3

答え2

私はawkスクリプトを使います:

/^checking results for / {
    if (curvar) { print curvar, curstatus; }
    curvar = $NF
    curstatus = "ok"
}
/^here are some results.* for .* status / {
    if ($NF != "ok") { curstatus = $NF; 
}
END {
    if (curvar) { print curvar, curstatus; }
}

配列を使用して「誤った結果」テーブルを作成できます。

関連情報