Domanda

Ok ragazzi sono davvero in un vicolo cieco qui, non so che altro per provare ...

Sto scrivendo una sceneggiatura per alcune statistiche di posta elettronica, una delle cose che deve fare è calcolare la dimensione completa di tutti i messaggi della maillog, questo è quello che ho scritto finora:

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

E qui è una linea di esempio dalla mia 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]

Quindi cercherò di spiegare passo per passo:

Per prima cosa ho grep attraverso il file per trovare tutte le linee che contengono la "dimensione" reale, prossima stampo campo 8, in questo caso "size = 40992".

Poi ho sostituire tutti i caratteri virgola con un segno più.

Poi ho eliminare tutto tranne le cifre e il segno più.

Poi ho sostituire l'inizio della linea con un "(", ed io sostituire l'ultima più segno più con un ")" seguito da "/ 1048576". Così ho un enorme espressione simile a questo:

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

Perché voglio sommare tutte le singole dimensioni dei messaggi e dividerlo in modo da ottenere il risultato in MB.

L'ultimo comando awk è quando ricevo un numero decimale davvero non mi interessa per la precisione così ho appena stampare la parte prima del punto decimale.

Il problema è che questo non funziona ... E potrei giurare che stava lavorando ad un certo punto, potrebbe essere la mia espressione è troppo lungo per bc da gestire?

Grazie, se si ha il tempo di leggere attraverso:)

È stato utile?

Soluzione

Credo che uno script awk una riga funzionerà anche. Esso corrisponde a qualsiasi linea che le corrispondenze di pattern egrep, poi per quelle linee si divide l'ottavo record il segno = e aggiunge la seconda parte (il numero) alla variabile SUM. Quando si vede la fine del file esso stampa il valore di SUM / 1048576 (o il numero di byte in Mibibytes).

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

Altri suggerimenti

  • bc induttanze se non c'è a capo nel suo ingresso, come accade con la vostra espressione. Devi cambiare la parte sed a:

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

  • L'awk finale sarà lieto di mangiare tutto l'output se la dimensione totale è inferiore a 1 MB e qualcosa bc uscite come ,03333334234. Se non si è interessati alla parte decimale rimuovere tale ultimo comando awk e il parametro -l da bc.

  • Lo farei con questo one-liner:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top