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; }
}

배열을 사용하여 "잘못된 결과" 테이블을 작성할 수 있습니다.

관련 정보