OneLiner, чтобы рассчитать полный размер всех сообщений в Maillog
Вопрос
Хорошо, ребята, я действительно в тупике здесь, не знаю, что еще попробовать ...
Я пишу сценарий для некоторой статистики электронной почты, одна из вещей, которые ему нужно сделать,-это рассчитать полный размер всех сообщений в 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 |' ' | до н.э