Eu escrevo abaixo o script awk para isso:
nodestat |awk -v Yday="$(date -d "$(date -d '-1day' '+%Y-%m-%d 00:00:00')" +%s)" -F"[ ,]" \
'{ Mdate=$(NF-1)" "$NF;
dMepoch="date -d""\""Mdate"\""" +%s";
dMepoch |getline Mdate; close(dMepoch)
}
$0 ~ /node mode : produce/ && NR==1 && Mdate<Yday{tru++;next}
{print($0 ~ /node status: active/ && NR==2 && Mdate<Yday && tru)?"OK":"NOT OK";exit
}'
OK
Explicação:
- Em
$(date -d "$(date -d '-1day' '+%Y-%m-%d 00:00:00')" +%s), primeiro obtemos a data de ontem neste formatoY-m-d 00:00:00by$(date -d '-1day' '+%Y-%m-%d 00:00:00')e, em seguida, convertemo-la em epoch tempo e atribuir à variável chamadaYday. - Em
F"[ ,]", estamos definindo o separador de arquivos como vírgula e espaço . - Em
Mdate=$(NF-1)" "$NF;, com base no separador arquivado, estamos usando os dois últimos campos em uma variável chamadaMdate, que contém apenas data , e; - Em
dMepoch="date -d""\""Mdate"\""" +%s";, definimos um comando de shell comodate -d""\""Mdate"\""" +%se atribuímos a uma variável chamadadMepoch; e comdMepoch |getline Mdate;chamamos o comando anterior Usando o getline de um cano com o o valor deMdatepassando para ele para obter sua época e manter a mesma variávelMdate, então; - No final, precisamos fechar o comando que abrimos, então usamos
close(dMepoch)para fechá-lo.
Agora, temos a data e a data de ontem para cada linha de nodestat na época em que todas as linhas awk serão lidas. Mais tarde por
-
$0 ~ /node mode : produce/ && NR==1 && Mdate<Yday{tru++;next}, estamos verificando se a primeira linhaNR==1e o tempo de modificação (época salva emMdate) é mais antiga que a data de ontem (época emYday) e a linha contémnode mode : produceem seguida, defina um sinalizadortru++e executeawkparanextline, então -
Em
print($0 ~ /node status: active/ && NR==2 && Mdate<Yday && tru)?"OK":"NOT OK";exit, estamos sufocando o mesmo tempo de modificação na segunda linhaNR==2e contém nossa correspondência e também se todas as condições foram atendidas na primeira linhatru!=0, depois imprima "OK", caso contrário imprima "NÃO OK" pela condição ternáriaprint (condition)?if_true:if_false. Oexité usado aqui sempre que a primeira linha não atenda às condições e na primeira execução deawk, a mensagem "NÃO OK" será impressa e a saída impedirá a duplicação de "NÃO OK".