Como agrupar os resultados do grep?

1

Eu tenho um arquivo que contém resultados agrupados em categorias. Por exemplo:

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

Preciso verificar se alguma das linhas de uma determinada categoria tem status "crítico" e exibi-la em caso afirmativo. Por exemplo:

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

Note : Critial at $result3 for $var3

O uso de grep -A não me agradaria muito, porque o número de resultados sob uma variável específica varia.

    
por afbr1201 04.10.2011 / 10:01

2 respostas

2

O Awk fará isso:

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])
        }
    }
'

saídas

$var ok
$var2 ok
$var3 critical
critical at results3 for $var3
    
por 04.10.2011 / 13:11
1

Eu usaria um script do 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; }
}

Você pode usar uma matriz para criar a tabela "resultados ruins".

    
por 04.10.2011 / 13:04

Tags