Страница 1 из 1
Задачка
Добавлено: 2010-02-20 14:00:33
iye
Приветствую!
Ходил недавно на одно собеседование и там задали загадку интересную, к которой я так и не смог найти решение. Вот думаю, а у нее вообще имеется решение или нет ?
Задача: Дан файл : /var/log/maillog вывести топ-10 адресов с которых отрпавлялась почта. Реализовать это все в 1 строку на шеле.
Re: Задачка
Добавлено: 2010-02-20 16:54:24
f_andrey
В одну строку да еще и на чистом sh думаю если и можно то сложно, а если на каком нибудь bash думаю вполне реально, там прийдется просто скорее всего циклом считать количество писем, с одного адреса.
А в остальном вроде ничего сложного
Ну попробовали бы погуглить и привести свои задумки а народ бы помог где не справитесь, иначе в чем смысл, или вы хотите узнать может ли кто из форумчан такое сделать, скорее всего да ,но зачем?
Re: Задачка
Добавлено: 2010-02-20 17:02:57
Syward
Код: Выделить всё
#cat maillog | grep from= | awk '{print $7}' | grep '@' | sort -n | uniq -c|tail -n 10
21 from=<root@syward.myt>,
18 from=<syward@syward.myt>,
Re: Задачка
Добавлено: 2010-02-20 17:55:28
iye
2 f_andrey Ога .. я вот тоже думал что данные нада где то хранить... и оказался не прав. Спать мне не давала спокойно эта задача, вот и спокойствия своего ради написал сюда и получил хороший ответ )
2 Syward Спасибо.
Re: Задачка
Добавлено: 2010-02-20 18:41:18
ProFTP
Код: Выделить всё
perl -MData::Dumper -0x0a -lne ' $hash->{$1}++ while $_ =~ /from=\<([\w+\-\.]+\@[\w\-\.]+\.\w{2,3})(.*)\>/smg; END { print Dumper $hash }' /var/log/maillog
$VAR1 = {
'socializationrus5@gangfreekentucky.com' => 1,
'gavinz4@ratiobuy.com' => 1,
'officiatesp1@puntocina.com' => 1,
'www@thedj.org.ua' => 472,
'marauderin9@wildlifedinnerware.com' => 1,
'di@thedj.org.ua' => 88,
'backpacking@plantprocesses.com' => 1,
'root@apachejail.example.com' => 12,
'comprehendsrgd9@thomasmedlinappraisals.com' => 1,
'acclimatizinghjf602@tanning-chemicals.com' => 1,
'root@thedj.org.ua' => 777,
'aggressor@mobiture.com' => 1,
'fluidk6@sz-zp.com' => 1
};
я вот только что настрочил, чтобы вывести ТОП айпишников в этом файле
Код: Выделить всё
perl -MData::Dumper -0x0a -lne ' $hash->{$1}++ while $_ =~ /(\d+\.\d+\.\d+\.\d+)/smg; END { print Dumper $hash }' /var/log/maillog
я что-то регулярные выражения призабыл ...
Re: Задачка
Добавлено: 2010-02-20 19:02:24
ProFTP
кстате, LizardOfOzz вы на ruby прогарммируете еще? почему не разу однострока не показывали?
Re: Задачка
Добавлено: 2010-02-20 22:02:12
iye
На перле задача не довыполнена - нет сортировки и домен может быть и 4буквенным (.info например, и даже как тока что посмотрел 5ти... .travel).
Re: Задачка
Добавлено: 2010-02-20 22:08:20
LizardOfOzz
ProFTP писал(а):кстате, LizardOfOzz вы на ruby прогарммируете еще? почему не разу однострока не показывали?
На мой взгляд, ruby придуман не для того, чтобы однострочные скрипты составлять.
Re: Задачка
Добавлено: 2010-02-20 22:45:11
ProFTP
LizardOfOzz писал(а):ProFTP писал(а):кстате, LizardOfOzz вы на ruby прогарммируете еще? почему не разу однострока не показывали?
На мой взгляд, ruby придуман не для того, чтобы однострочные скрипты составлять.
я вот недавно увидел
http://mjtsai.com/blog/2002/11/25/perl_ ... n_vs_ruby/
тут написано что тоже можно писать в одну строку
там в коментах был пример, не могу сейчас найти
Re: Задачка
Добавлено: 2010-02-20 23:15:01
LizardOfOzz
ProFTP писал(а):LizardOfOzz писал(а):ProFTP писал(а):кстате, LizardOfOzz вы на ruby прогарммируете еще? почему не разу однострока не показывали?
На мой взгляд, ruby придуман не для того, чтобы однострочные скрипты составлять.
я вот недавно увидел
http://mjtsai.com/blog/2002/11/25/perl_ ... n_vs_ruby/
тут написано что тоже можно писать в одну строку
там в коментах был пример, не могу сейчас найти
Да я не сомневаюсь, что можно. Но зачем, если на sh вон как красиво получается?
Re: Задачка
Добавлено: 2010-02-20 23:32:32
ProFTP
iye писал(а):На перле задача не довыполнена - нет сортировки и домен может быть и 4буквенным (.info например, и даже как тока что посмотрел 5ти... .travel).
у меня не получилось коротко написать сортровку по значениям, были только варианты длинные...
по этому взял вариант в гугле
http://www.google.com.ua/#hl=uk&q=perl+ ... c956da6ac9
http://xpoint.ru/forums/programming/per ... 5117.xhtml
Код: Выделить всё
# perl -0x0a -lne '@$a= sort{$hash->{$b} <=> $hash->{$a}} keys %$hash; $hash->{$1}++ while $_ =~ /from=\<([\w+\-\.]+\@[\w\-\.]+\.\w{2,4})(.*)\>/smg; END { print $a->[$_] for (0..3) }' /var/log/maillog
root@thedj.org.ua
www@thedj.org.ua
di@thedj.org.ua
root@apachejail.example.com
Re: Задачка
Добавлено: 2010-02-20 23:44:04
ProFTP
LizardOfOzz писал(а):
Да я не сомневаюсь, что можно. Но зачем, если на sh вон как красиво получается?
понятно, java, например, тоже не очень предназначеная для этого, хотя регулярные выражения там есть...
Re: Задачка
Добавлено: 2010-02-21 0:16:32
noerus
Задачка классическая.
Связка
Код: Выделить всё
cat лог | grep | cut | sort | uniq -c | sort -n
применяется очень часто.
Кстати, в примере
Syward не хватает последнего sort-a, на больших логах (с количеством адресов больше чем 2, как в примере) это проявится.
Попробуйте-ка лучше этот паровоз упростить, чтоб команд меньше было.

Интересно, получится ли?
Re: Задачка
Добавлено: 2010-02-21 14:32:43
iye
У него просто uniq и sort местами поменяны, но это не важно .. главно общая мысль.
Re: Задачка
Добавлено: 2010-02-21 18:15:00
noerus
iye писал(а):У него просто uniq и sort местами поменяны, но это не важно .. главно общая мысль.
В том и дело, что важно. Главная фишка всей этой строки заключается как раз в комбинации
Без первого sort-а не будет правильно работать uniq, а без последнего - не будет сортировки "по рейтингу", которая нужна для вывода того самого TOP10.
Re: Задачка
Добавлено: 2010-02-21 18:58:52
iye
http://www.opennet.ru/man.shtml?topic=u ... %D4%D8+man
Я слепой или всетаки нигде не написано что одинаковые строки должны идти последовательно ?
Re: Задачка
Добавлено: 2010-02-21 20:22:10
noerus
iye писал(а):Я слепой или всетаки нигде не написано что одинаковые строки должны идти последовательно ?
Ну типа написано, но типа трактовать можно по-разному. Проще проверить на конкретном примере:
Код: Выделить всё
overmind# cat /var/log/auth.log | grep Invalid | awk '{print $8}' | uniq | grep test
test
test1
test
testaccount
test
test
test
test
test
test
test
test
test
test
test
test
test
test
test
test
test
test
overmind# cat /var/log/auth.log | grep Invalid | awk '{print $8}' | sort | uniq | grep test
test
test1
testaccount
Re: Задачка
Добавлено: 2010-02-24 12:47:58
iye
Значит должны быть отсортированы и я не прав. (Нет под рукой перла чтоб проверить (). Чтобы не плодить тем напишу тут.
Существует ли более компактное решение следующей задачи: Вывести все строки текстового файла, за исключением тех которые начинаются с пробела либо с символа решетки. Я сделал так:
Re: Задачка
Добавлено: 2010-02-24 16:26:20
baton4eg
сталкнулся с задачкой, дан файл с мак-адрессами вида:
002618af3e71
002618af3e72
002618af3e73
002618af3e74
Нужно через каждые 4 символа поставить "точку" и получить в результате вид:
0026.18af.3e71
0026.18af.3e72
0026.18af.3e73
0026.18af.3e74
с седом игрался, не получилось
Re: Задачка
Добавлено: 2010-02-24 17:43:17
iye
На перле будет выглядеть примерно так:
Код: Выделить всё
#!/usr/bin/perl -w
while (<>){
chomp;
print "substr($_,0,4)\.substr($_,3,4)\.substr($_,7,4)\n";
}
Юзать примерно так:
Re: Задачка
Добавлено: 2010-02-24 22:51:08
FiL
iye писал(а):и даже как тока что посмотрел 5ти... .travel).
Нда.. с арифметикой первого класса замечены серьезные проблемы
по поводу uniq - вроде понятным языком написано
The utility reads the specified input_file
comparing adjacent lines, and writes a copy of each unique input line to the output_file If input_file is a single dash (`- ' ) or absent, the standard input is read. If output_file is absent, standard output is used for output. The second and succeeding copies of identical adjacent input lines are not written. Repeated lines in the input will not be detected
if they are not adjacent, so it may be necessary to sort the files first.
Re: Задачка
Добавлено: 2010-02-25 12:38:46
iye
Спасибо. Читал перевод мана - там ничего такого не было (. По поводу вывода файла без решетек и начальных пробелов никто не хочет ничего сказать ? Может есть тоже какое то волшебное средство о которм я не знаю/забыл ?
Re: Задачка
Добавлено: 2010-02-25 16:54:04
FreeBSP