Задачка

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Задачка

Непрочитанное сообщение iye » 2010-02-20 14:00:33

Приветствую!
Ходил недавно на одно собеседование и там задали загадку интересную, к которой я так и не смог найти решение. Вот думаю, а у нее вообще имеется решение или нет ?
Задача: Дан файл : /var/log/maillog вывести топ-10 адресов с которых отрпавлялась почта. Реализовать это все в 1 строку на шеле.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
f_andrey
майор
Сообщения: 2651
Зарегистрирован: 2007-12-26 1:22:58
Откуда: СПб
Контактная информация:

Re: Задачка

Непрочитанное сообщение f_andrey » 2010-02-20 16:54:24

В одну строку да еще и на чистом sh думаю если и можно то сложно, а если на каком нибудь bash думаю вполне реально, там прийдется просто скорее всего циклом считать количество писем, с одного адреса.
А в остальном вроде ничего сложного :sorry:
Ну попробовали бы погуглить и привести свои задумки а народ бы помог где не справитесь, иначе в чем смысл, или вы хотите узнать может ли кто из форумчан такое сделать, скорее всего да ,но зачем?
Если ваша тема перенесена, то смотри http://forum.lissyara.su/viewtopic.php?f=1&t=32308

Аватара пользователя
Syward
мл. сержант
Сообщения: 81
Зарегистрирован: 2008-07-06 22:27:33
Откуда: Mytischi
Контактная информация:

Re: Задачка

Непрочитанное сообщение Syward » 2010-02-20 17:02:57

Код: Выделить всё

#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>,
Существует рoвнo oдин интуитивнo пoнятный интерфейс - сoска. Все остальные oсваиваются путем oбучения или методом тыка...©

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Задачка

Непрочитанное сообщение iye » 2010-02-20 17:55:28

2 f_andrey Ога .. я вот тоже думал что данные нада где то хранить... и оказался не прав. Спать мне не давала спокойно эта задача, вот и спокойствия своего ради написал сюда и получил хороший ответ )
2 Syward Спасибо.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Задачка

Непрочитанное сообщение ProFTP » 2010-02-20 18:41:18

Код: Выделить всё

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


я что-то регулярные выражения призабыл ...
Последний раз редактировалось ProFTP 2010-02-20 20:52:17, всего редактировалось 3 раза.
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Задачка

Непрочитанное сообщение ProFTP » 2010-02-20 19:02:24

кстате, LizardOfOzz вы на ruby прогарммируете еще? почему не разу однострока не показывали?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Задачка

Непрочитанное сообщение iye » 2010-02-20 22:02:12

На перле задача не довыполнена - нет сортировки и домен может быть и 4буквенным (.info например, и даже как тока что посмотрел 5ти... .travel).

Аватара пользователя
LizardOfOzz
сержант
Сообщения: 165
Зарегистрирован: 2009-01-06 13:15:20
Откуда: Станция Восток
Контактная информация:

Re: Задачка

Непрочитанное сообщение LizardOfOzz » 2010-02-20 22:08:20

ProFTP писал(а):кстате, LizardOfOzz вы на ruby прогарммируете еще? почему не разу однострока не показывали?
На мой взгляд, ruby придуман не для того, чтобы однострочные скрипты составлять.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Задачка

Непрочитанное сообщение ProFTP » 2010-02-20 22:45:11

LizardOfOzz писал(а):
ProFTP писал(а):кстате, LizardOfOzz вы на ruby прогарммируете еще? почему не разу однострока не показывали?
На мой взгляд, ruby придуман не для того, чтобы однострочные скрипты составлять.
я вот недавно увидел http://mjtsai.com/blog/2002/11/25/perl_ ... n_vs_ruby/
тут написано что тоже можно писать в одну строку

там в коментах был пример, не могу сейчас найти
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
LizardOfOzz
сержант
Сообщения: 165
Зарегистрирован: 2009-01-06 13:15:20
Откуда: Станция Восток
Контактная информация:

Re: Задачка

Непрочитанное сообщение LizardOfOzz » 2010-02-20 23:15:01

ProFTP писал(а):
LizardOfOzz писал(а):
ProFTP писал(а):кстате, LizardOfOzz вы на ruby прогарммируете еще? почему не разу однострока не показывали?
На мой взгляд, ruby придуман не для того, чтобы однострочные скрипты составлять.
я вот недавно увидел http://mjtsai.com/blog/2002/11/25/perl_ ... n_vs_ruby/
тут написано что тоже можно писать в одну строку

там в коментах был пример, не могу сейчас найти
Да я не сомневаюсь, что можно. Но зачем, если на sh вон как красиво получается?

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Задачка

Непрочитанное сообщение ProFTP » 2010-02-20 23:32:32

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
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Задачка

Непрочитанное сообщение ProFTP » 2010-02-20 23:44:04

LizardOfOzz писал(а): Да я не сомневаюсь, что можно. Но зачем, если на sh вон как красиво получается?

понятно, java, например, тоже не очень предназначеная для этого, хотя регулярные выражения там есть...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

noerus
рядовой
Сообщения: 21
Зарегистрирован: 2010-02-17 3:34:17

Re: Задачка

Непрочитанное сообщение noerus » 2010-02-21 0:16:32

Задачка классическая.
Связка

Код: Выделить всё

cat лог | grep | cut | sort | uniq -c | sort -n
применяется очень часто.
Кстати, в примере Syward не хватает последнего sort-a, на больших логах (с количеством адресов больше чем 2, как в примере) это проявится.

Попробуйте-ка лучше этот паровоз упростить, чтоб команд меньше было. :) Интересно, получится ли?

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Задачка

Непрочитанное сообщение iye » 2010-02-21 14:32:43

У него просто uniq и sort местами поменяны, но это не важно .. главно общая мысль.

noerus
рядовой
Сообщения: 21
Зарегистрирован: 2010-02-17 3:34:17

Re: Задачка

Непрочитанное сообщение noerus » 2010-02-21 18:15:00

iye писал(а):У него просто uniq и sort местами поменяны, но это не важно .. главно общая мысль.
В том и дело, что важно. Главная фишка всей этой строки заключается как раз в комбинации

Код: Выделить всё

| sort | uniq -c | sort -n
Без первого sort-а не будет правильно работать uniq, а без последнего - не будет сортировки "по рейтингу", которая нужна для вывода того самого TOP10.

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Задачка

Непрочитанное сообщение iye » 2010-02-21 18:58:52

http://www.opennet.ru/man.shtml?topic=u ... %D4%D8+man
Я слепой или всетаки нигде не написано что одинаковые строки должны идти последовательно ?

noerus
рядовой
Сообщения: 21
Зарегистрирован: 2010-02-17 3:34:17

Re: Задачка

Непрочитанное сообщение noerus » 2010-02-21 20:22:10

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

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Задачка

Непрочитанное сообщение iye » 2010-02-24 12:47:58

Значит должны быть отсортированы и я не прав. (Нет под рукой перла чтоб проверить (). Чтобы не плодить тем напишу тут.
Существует ли более компактное решение следующей задачи: Вывести все строки текстового файла, за исключением тех которые начинаются с пробела либо с символа решетки. Я сделал так:

Код: Выделить всё

 cat file | grep -E '^(\S|[^#])'

Аватара пользователя
baton4eg
сержант
Сообщения: 274
Зарегистрирован: 2009-10-11 14:36:35
Контактная информация:

Re: Задачка

Непрочитанное сообщение baton4eg » 2010-02-24 16:26:20

сталкнулся с задачкой, дан файл с мак-адрессами вида:
002618af3e71
002618af3e72
002618af3e73
002618af3e74

Нужно через каждые 4 символа поставить "точку" и получить в результате вид:
0026.18af.3e71
0026.18af.3e72
0026.18af.3e73
0026.18af.3e74

с седом игрался, не получилось
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих файлов вообще нет!" (c)
"Я ем руками, она вилкой и ножом, я бью вилкой и ножом, она руками" (с)

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Задачка

Непрочитанное сообщение iye » 2010-02-24 17:43:17

На перле будет выглядеть примерно так:

Код: Выделить всё

#!/usr/bin/perl -w
while (<>){
 chomp;
 print "substr($_,0,4)\.substr($_,3,4)\.substr($_,7,4)\n";
}
Юзать примерно так:

Код: Выделить всё

cat file_src | test.pl> file_dst

FiL
ст. лейтенант
Сообщения: 1374
Зарегистрирован: 2010-02-05 0:21:40

Re: Задачка

Непрочитанное сообщение FiL » 2010-02-24 22:51:08

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.

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Задачка

Непрочитанное сообщение iye » 2010-02-25 12:38:46

Спасибо. Читал перевод мана - там ничего такого не было (. По поводу вывода файла без решетек и начальных пробелов никто не хочет ничего сказать ? Может есть тоже какое то волшебное средство о которм я не знаю/забыл ?

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Задачка

Непрочитанное сообщение FreeBSP » 2010-02-25 16:54:04

Код: Выделить всё

grep -E '^(\S|[^#])' file
:roll:
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!