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:00
by$(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"\""" +%s
e 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 deMdate
passando 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==1
e o tempo de modificação (época salva emMdate
) é mais antiga que a data de ontem (época emYday
) e a linha contémnode mode : produce
em seguida, defina um sinalizadortru++
e executeawk
paranext
line, 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==2
e 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".