Question

Ok les gars, je suis vraiment dans une impasse ici, ne savent pas quoi essayer ...

Je suis en train d'écrire un script pour quelques statistiques e-mail, l'une des choses dont il a besoin de faire est de calculer la taille totale de tous les messages du maillog, c'est ce que je l'ai écrit à ce jour:

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

Et voici une ligne de mon échantillon 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]

Je vais essayer de l'expliquer étape par étape:

D'abord, je grep le fichier pour trouver toutes les lignes contenant la « taille » réelle, à côté i imprimer le champ 8, dans ce cas « size = 40992, ».

Ensuite, je remplace tous les caractères virgule avec un signe plus.

Alors je supprimer tout sauf les chiffres et le signe plus.

Puis-je remplacer le début de la ligne avec un « ( » et je remplace le dernier supplémentaire signe plus avec un « ) » suivi de « / 1048576 ». Donc, je reçois une énorme expression qui ressemble à ceci:

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

Parce que je veux ajouter toutes les tailles de messages individuels et le diviser donc j'obtenir le résultat en MB.

La dernière commande awk est quand je reçois un nombre décimal Je ne me inquiète pas vraiment de précision donc j'imprimer seulement la partie avant le point décimal.

Le problème est, cela ne fonctionne pas ... Et je jurerais travaillait à un moment donné, pourrait-il être mon expression est trop long pour la Colombie-Britannique à gérer?

Merci si vous avez pris le temps de lire:)

Était-ce utile?

La solution

Je pense un script awk une ligne fonctionnera aussi. Il correspond à une ligne que vos matchs de motif egrep, alors pour ces lignes, il divise le huitième disque par le signe = et ajoute la seconde partie (le nombre) à la variable SUM. Quand il voit la fin du fichier, il imprime la valeur de SUM / 1.048.576 (ou le nombre d'octets dans Mibibytes).

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

Autres conseils

  • bc selfs s'il n'y a pas de nouvelle ligne dans son entrée, comme cela se produit avec votre expression. Vous devez changer la partie sed à:

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

  • La awk finale se fera un plaisir de manger tous vos sortie si la taille totale est inférieure à 1 Mo et de quelque chose de bc comme ,03333334234. Si vous n'êtes pas intéressé par la supprimer une partie décimale que la dernière commande awk et le paramètre -l de bc.

  • Je le ferais avec ce one-liner:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top