Команда awk для проверки условий из первого поля первой строки и второго поля первой строки [закрыто]

0
20.02.2018, 15:07
1 ответ

Escribo a continuación un guión corto awkpara esto:

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

Explicación:

  • En $(date -d "$(date -d '-1day' '+%Y-%m-%d 00:00:00')" +%s), primero obtenemos la fecha de ayer en este formato Y-m-d 00:00:00por $(date -d '-1day' '+%Y-%m-%d 00:00:00'), luego la convertimos a tiempo de época y la asignamos a la variable llamada Yday.
  • En F"[,]", estamos definiendo el separador archivado como coma y espacio .
  • En Mdate=$(NF-1)" "$NF;, según el separador de archivos, tomamos los últimos dos campos en una variable llamada Mdateque contiene solo fecha , luego;
  • En dMepoch="date -d""\""Mdate"\""" +%s";, configuramos un comando de shell como date -d""\""Mdate"\""" +%sy lo asignamos a una variable llamada dMepoch; y con dMepoch |getline Mdate;llamamos al comando anterior Usando getline desde un Pipe con el valor de Mdatepasando a él para obtener su época y mantener la misma variable Mdatetambién, entonces;
  • Al final necesitamos cerrar el comando que abrimos, así que usamosclose(dMepoch)para cerrarlo.

Ahora tenemos tanto la fecha de ayer como la fecha de cada fila de nodestaten la época que leerá cada línea awk. Más tarde por

  • $0 ~ /node mode : produce/ && NR==1 && Mdate<Yday{tru++;next}, estamos comprobando si es la primera línea NR==1y modificamos la hora (la época guardada enMdate)es anterior a la fecha de ayer (la época enYday)y la línea contiene node mode : produce, luego establecemos una bandera tru++y ejecute awkpara la línea next, entonces

  • En print($0 ~ /node status: active/ && NR==2 && Mdate<Yday && tru)?"OK":"NOT OK";exit, estamos ahogando el mismo tiempo de modificación en la segunda línea NR==2y contiene nuestra coincidencia y también si todas las condiciones se cumplieron en la primera línea tru!=0, luego imprima "OK", de lo contrario imprima "NO OK "por condición ternaria print (condition)?if_true:if_false. El exitse usa aquí siempre que si la primera línea no cumple con las condiciones y en la primera ejecución de awkimprimirá "NO CORRECTO" y saldrá, lo que evitará la duplicación de "NO CORRECTO".

0
28.01.2020, 04:30

Теги

Похожие вопросы