es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Restar el valor encontrado con la primera y última línea de un registro.

Estoy tratando de encontrar la duración total de una operación.
Dentro de los registros, quiero recuperar cada línea relacionada con una operación de ELIMINAR para una lista de nombres de objetos específicos (digamos carpetas) que contienen elementos (como archivos).
Los registros informan cada operación de eliminación: para medir la duración del Delete para un objeto específico, puedo restar la marca de tiempo del primero al último Delete.

Encontré una forma de realizar esta operación, pero me gustaría obtener sus consejos para que se vea y funcione mejor.

for name in $(cat List_to_Del) ; do
    grep $name access_log |
    grep "method=DELETE" |
    awk 'NR==1 ; END{print}' |
    awk -F, '{print $3}' |
    awk -F= '{print $2}' |
    paste -sd- - |
    bc |
    awk -F- '{print $NF}'
done

Bucle for. Estoy buscando en una lista de nombres eliminados y los busco en mi registro.
Recupero la lista completa de operaciones DELETE, nombre por nombre.
Luego (primer comando awk) mantengo solo la primera y última línea para cada nombre.
Luego solo recupero el campo número 2 dentro del campo número 3.
Luego uso el comando paste para escribir ambos valores en una línea con el signo “-” como delimitador, lo paso a bc y elimino el signo de menos.

Aquí tienes un ejemplo de registros:

16/Nov/2021:17:07:42,100,ts=1637078862.235,method=DELETE,name1,,,
16/Nov/2021:17:07:42,100,ts=1637078862.236,method=PUT,name4,,,
16/Nov/2021:17:07:42,100,ts=1637078862.243,method=DELETE,name1,,,
16/Nov/2021:17:07:42,100,ts=1637078862.254,method=DELETE,name2,,,
16/Nov/2021:17:07:42,100,ts=1637078862.256,method=DELETE,name1,,,
16/Nov/2021:17:07:42,100,ts=1637078862.260,method=DELETE,name2,,,
Tags:  

Answer

  1. Avatar for davy.ai

    Para hacer este comando más eficiente y legible, podemos usar un solo comando awk en lugar de múltiples comandos encadenados juntos. Aquí hay un ejemplo:

    awk -F, 'FNR==NR && FNR==1 {print "nombre,iniciotiempo,tiempofinal,duracion"}    # Imprimir encabezado para la salida
             FNR==NR && $0 ~ /method=DELETE/ {start[$4]=$3}                  # Almacenar el tiempo de inicio para cada operación de eliminación
             FNR!=NR {if ($0 ~ /method=DELETE/ && $4 in start)               # Si hay una operación de eliminación coincidente para el nombre dado
                          {end=$3; duration=end-start[$4]; print $4,start[$4],end,duration}    # Calcular la duración e imprimir la salida
                      }' List_to_Del access_log
    

    Este comando awk lee tanto la lista de nombres para eliminar como el archivo de registro de acceso. Primero imprime un encabezado para la salida. Luego procesa el archivo de registro de acceso y almacena el tiempo de inicio para cada operación de eliminación en un array asociativo indexado por el nombre del objeto. Finalmente, para cada nombre en la lista para eliminar, verifica si hay una operación de eliminación coincidente y calcula la duración entre el tiempo de inicio y final. La salida se imprime en un formato tabular.

    Este comando solo necesita leer el archivo de registro de acceso una vez, lo cual debería ser más eficiente que múltiples comandos grep y awk. También hace que el código sea más legible y más fácil de modificar si es necesario.

Comments are closed.