OneLiner, чтобы рассчитать полный размер всех сообщений в Maillog

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

  •  10-10-2019
  •  | 
  •  

Вопрос

Хорошо, ребята, я действительно в тупике здесь, не знаю, что еще попробовать ...

Я пишу сценарий для некоторой статистики электронной почты, одна из вещей, которые ему нужно сделать,-это рассчитать полный размер всех сообщений в Maillog, это то, что я написал до сих пор:

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

А вот примерная линия от моего 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]

Поэтому я постараюсь объяснить это шаг за шагом:

Сначала я пробираюсь через файл, чтобы найти все строки, содержащие фактический «размер», затем я печатаю 8 -е поле, в данном случае «размер = 40992».

Затем я заменяю всех персонажей запятой на знак плюс.

Затем я удаляю все, кроме цифр и знака плюса.

Затем я заменяю начало линии на «(», и я заменяю последний экстра дополнительно плюс знак «)", а затем "/1048576". Так что я получаю огромное выражение, похожее на это:

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

Потому что я хочу сложить все отдельные размеры сообщений и разделить его, чтобы я получил результат в MB.

Последняя команда AWK - это когда я получаю десятичное число, мне действительно не волнует точность, поэтому я просто печатаю деталь перед десятичной точкой.

Проблема в том, что это не работает ... и я мог бы поклясться, что это работало в какой -то момент, может ли это быть мое выражение слишком длинное для BC, чтобы справиться с?

Спасибо, если вы нашли время, чтобы прочитать :)

Это было полезно?

Решение

Я думаю, одна строка awk Сценарий тоже будет работать. Он соответствует любой строке, которую соответствует вашему рисунку EGREP, затем для этих строк он расщепляет восьмую запись по знаке = и добавляет вторую часть (число) к переменной суммы. Когда он видит конец файла, он распечатывает значение Sum/1048576 (или подсчет байтов в Mibibytes).

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

Другие советы

  • BC задыхается, если в его вводе нет новой линии, как это происходит с выражением вашего выражения. Вы должны изменить часть SED на:

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

  • Окончательный Awk с радостью съест всю вашу производительность, если общий размер составляет менее 1 МБ, а BC выводит что -то вроде 0,0333334234. Если вы не заинтересованы в десятичной части, удалите эту последнюю команду AWK и параметр -l из BC.

  • Я бы сделал это с этой линейкой:

grep 'hostname sendmail [[0-9] [0-9]*]: ..*:.*из = ..*, size =' maillog | sed 's |.*, size = ([0-9] [0-9]*),.*| 1+ |' '' ' | tr -d ' n' | sed 's |^| (|; s | $ | 0)/1048576 n |' ' | до н.э

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top