2015-02-16 5 views
4

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

В настоящее время я удаляю всю информацию, которая мне не нужна, но я не могу подсчитать, сколько писем отправляется каждому уникальному пользователю.

То, что я написал до сих пор:

awk '{print $3, $7;}' ./maillog | sed '/from/!d' | sed 's/:[0-9][0-9]:[0-9][0-9] /:00 /g' | sed 's/from=<//g' | egrep '[a-zA-Z0-9]+\@[a-zA-Z0-9.-]+(org|net|com)' | uniq -c > output.txt 

Основная проблема заключается в том, что (я считаю), что я нахожу тот же пользователю несколько раз в тот же час (что я не хочу).

Here - это то, что мне нужно получить. Имейте в виду, что то, что мне нужно получить, является просто примером, это не правильный результат, который я должен иметь. Если вы выполните скрипт, который я написал в файле, который я вам дал, вы получите user25 2 раза за тот же час, который не удовлетворяет требованиям.

Вот пример вывода, как кто-то предложил (очень долго):

Jan 16 08:33:04 mail.knurledwidgets.example.org sendmail[3539]: q5c1SrFqkAZq9b: Milter: connect to filters 
Jan 16 08:33:06 mail.knurledwidgets.example.org sendmail[3539]: q5c1SrFqkAZq9b: from=<[email protected]>, size=38065260, class=-30, nrcpts=1, msgid=<gnDSaYSEaP4Yk/.F0EhYbIYcihGO8Vd.dont-cross-the-memes.example.com>, proto=ESMTP, daemon=MTA-v6, relay=proton.dont-cross-the-memes.example.com [192.168.98.234] 
Jan 16 08:33:06 mail.knurledwidgets.example.org sendmail[7734]: qqGjhufuNY5UJ: Milter: connect to filters 
Jan 16 08:33:07 mail.knurledwidgets.example.org sendmail[8780]: qkwEbHuoJi40Lj: Milter: connect to filters 
Jan 16 08:33:07 mail.knurledwidgets.example.org sendmail[8780]: qkwEbHuoJi40Lj: from=<[email protected]>, size=36412443, class=-30, nrcpts=1, msgid=<w/7AIsHSy6.gkNTPlyyE55u.knurledwidgets.example.org>, proto=ESMTP, daemon=MTA-v6, relay=mail.knurledwidgets.example.org [10.0.0.20] 
Jan 16 08:33:08 mail.knurledwidgets.example.org sendmail[7734]: qqGjhufuNY5UJ: from=<[email protected]>, size=33411319, class=-30, nrcpts=1, msgid=<il/5SxUES9XwRhX.KfO6ywkQROALbnz.stellar-patrol.example.com>, proto=ESMTP, daemon=MTA-v6, relay=feinstein.stellar-patrol.example.com [192.168.73.3] 
Jan 16 08:33:09 mail.knurledwidgets.example.org sendmail[3539]: q5c1SrFqkAZq9b: Milter accept: message 
Jan 16 08:33:09 mail.knurledwidgets.example.org sendmail[8780]: qkwEbHuoJi40Lj: Milter accept: message 
Jan 16 08:33:10 mail.knurledwidgets.example.org sendmail[7734]: qqGjhufuNY5UJ: Milter accept: message 
Jan 16 08:33:12 mail.knurledwidgets.example.org sendmail[1618]: qhgKT0cN80gSX: Milter: connect to filters 
Jan 16 08:33:13 mail.knurledwidgets.example.org sendmail[1618]: qhgKT0cN80gSX: from=<[email protected]>, size=780642, class=-30, nrcpts=1, msgid=<hX49btAurMDDZlhWo.5RpGEJxQQilElvDgRpc3sw.knurledwidgets.example.org>, proto=ESMTP, daemon=MTA-v6, relay=mail.knurledwidgets.example.org [10.0.0.20] 

А вот пример вывода:

1 08:00 [email protected] 
1 08:00 [email protected] 
1 08:00 [email protected] 
5 08:00 [email protected] 
1 09:00 [email protected] 
1 09:00 [email protected] 
1 09:00 [email protected] 
7 09:00 [email protected] 
2 09:00 [email protected] 
1 09:00 [email protected] 

Просьба также объяснить ответ, что вам потому что цель состоит в том, чтобы научиться не выполнять упражнение.

Спасибо за ваше время

+0

Было бы полезно включить небольшую выборку вашего ввода и желаемый результат в самом вопросе. –

+0

Я добавил образцы, к сожалению, формирование ввода испортилось, в основном каждая строка начинается с Jan (для уточнения). –

+1

Я предполагаю, что это образец ** желаемого выхода? ** – merlin2011

ответ

2

sort перед тем uniq даст вам отсчеты:

awk '{print $3, $7;}' ./maillog | sed '/from/!d' | sed 's/:[0-9][0-9]:[0-9][0-9] /:00 /g' | sed 's/from=<//g' | egrep '[a-zA-Z0-9]+\@[a-zA-Z0-9.-]+(org|net|com)' | sort | uniq -c` 

    1 08:00 [email protected]>, 
    2 08:00 [email protected]>, 
    1 08:00 [email protected]>, 

См uniq --help:

Примечание: uniq не обнаруживает повторяющиеся строки, если они не являются смежны. Вы можете отсортировать входной файл первым или использовать sort -u без uniq. Кроме того, сравнения соблюдают правила, указанные в LC_COLLATE.

+0

Не могли бы вы объяснить, почему? Это как-то связано с uniq? Благодаря ! –

+0

Документация uniq должна указывать, что подсчитываются только строки _consecutive_, и эта сортировка может потребоваться для получения желаемого результата ... –

Смежные вопросы