awk comando para verificar condição do primeiro campo da primeira linha e segundo campo da primeira linha [fechado]

0

Eu tenho campos separados por vírgulas como abaixo, que é a saída do comando nodestat .

node mode  : produce ,  modify time: 2014-11-22 04:23:28
node status: active  ,  modify time: 2014-11-22 04:23:28

Eu quero imprimir "OK" se todas as condições abaixo forem exibidas:

  1. "modo de nó: produzir" (primeira linha na primeira coluna) e
  2. "status do nó: ativo" (segunda linha da primeira coluna) e
  3. o tempo de modificação é menor que o tempo de ontem (segunda coluna na primeira e segunda linha)

Caso contrário, imprima "NOT OK".

    
por user3548033 19.02.2018 / 12:51

1 resposta

0

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 formato Y-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 chamada Yday .
  • 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 chamada Mdate , que contém apenas data , e;
  • Em dMepoch="date -d""\""Mdate"\""" +%s"; , definimos um comando de shell como date -d""\""Mdate"\""" +%s e atribuímos a uma variável chamada dMepoch ; e com dMepoch |getline Mdate; chamamos o comando anterior Usando o getline de um cano com o o valor de Mdate passando para ele para obter sua época e manter a mesma variável Mdate , 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 linha NR==1 e o tempo de modificação (época salva em Mdate ) é mais antiga que a data de ontem (época em Yday ) e a linha contém node mode : produce em seguida, defina um sinalizador tru++ e execute awk para next 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 linha NR==2 e contém nossa correspondência e também se todas as condições foram atendidas na primeira linha tru!=0 , depois imprima "OK", caso contrário imprima "NÃO OK" pela condição ternária print (condition)?if_true:if_false . O exit é usado aqui sempre que a primeira linha não atenda às condições e na primeira execução de awk , a mensagem "NÃO OK" será impressa e a saída impedirá a duplicação de "NÃO OK".

por 19.02.2018 / 14:39