Un trazador de líneas para calcular el tamaño total de todos los mensajes en el registro de correo

StackOverflow https://stackoverflow.com/questions/4190275

  •  10-10-2019
  •  | 
  •  

Pregunta

Ok chicos estoy realmente en un callejón sin salida aquí, no sé qué más para intentar ...

Estoy escribiendo un guión para algunas estadísticas de correo electrónico, una de las cosas que necesita hacer es calcular el tamaño total de todos los mensajes en el registro de correo, esto es lo que he escrito hasta ahora:

egrep ' HOSTNAME sendmail\[.*.from=.*., size=' maillog | awk '{print $8}' |  
tr "," "+" | tr -cd '[:digit:][=+=]' | sed 's/^/(/;s/+$/)\/1048576/' |  
bc -ql | awk -F "." '{print $1}'

Y aquí es una línea de muestra de mi maillog:

Nov 15 09:08:48 HOSTNAME sendmail[3226]: oAF88gWb003226:  
from=<name.lastname@domain.com>, size=40992, class=0, nrcpts=24,  
msgid=<E08A679A54DA4913B25ADC48CC31DD7F@domain.com>, proto=ESMTP,  
daemon=MTA1, relay=[1.1.1.1]

Así que voy a tratar de explicar paso a paso:

En primer lugar me grep a través del archivo para encontrar todas las líneas que contienen el "tamaño" real, junto i imprimir el campo 8th, en este caso "size = 40992".

A continuación me vuelva a colocar todos los caracteres de coma con un signo más.

Luego de eliminar todo excepto los dígitos y el signo más.

Luego reemplazar el comienzo de la línea con un "(", y sustituir el último signo adicional con un ")" seguido de "/ 1048576". Así que conseguir una gran expresión de aspecto como este:

"(1 + 2 + 3 + 4 + 5 ... + n) / 1048576"

Porque quiero sumar todos los tamaños de los mensajes individuales y se divide por lo que obtener el resultado en MB.

El último comando awk es cuando consigo un número decimal que realmente no me importa para la precisión y por eso sólo se imprime la parte antes del punto decimal.

El problema es que esto no funciona ... Y yo podría jurar que estaba trabajando en un momento dado, ¿podría ser mi expresión es demasiado largo para bc a mango?

Gracias si tomamos el tiempo para leer:)

¿Fue útil?

Solución

creo que un guión awk de una línea funcionará también. Coincide con cualquier línea que sus partidos patrón egrep, a continuación, para aquellas líneas que divide el octavo disco por el signo = y añade la segunda parte (el número) a la variable SUMA. Cuando se ve el final del fichero, imprime el valor de SUM / 1048576 (o el número de bytes en Mibibytes).

awk '/ HOSTNAME sendmail\[.*.from=.*., size=/{ split($8,a,"=") ; SUM += a[2] } END { print SUM/1048576 }' maillog

Otros consejos

  • bc estrangulaciones si no hay una nueva línea en su entrada, como sucede con su expresión. Hay que cambiar la parte sed a:

sed 's / ^ / (/; s / + $ /) \ / 1048576 \ n /'

  • El awk final será comer felizmente toda su salida si el tamaño total es de menos de 1 MB y salidas bc algo así como ,03333334234. Si no está interesado en la parte decimal eliminar ese último comando awk y el parámetro -l de BC.

  • lo haría con esta sola línea:

grep 'HOSTNAME sendmail [[0-9] [0-9] *]: .. *:. * Desde = .. *, size =' maillog | sed 's |. *, size = \ ([0-9] [0-9] * \), * |. \ 1+ |' | tr -d '\ n' | sed 's | ^ | (|; s | $ | 0) / 1048576 \ n |' | bc

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top