Jump to content
  • Announcements

    • st1nc

      Жалобы на плохой пинг

      Жалобы принимаются по шаблону ниже в этой теме.   Город
      Провайдер
      Трассировка до серверов simhost.org
Sign in to follow this  
Shift

Учимся писать скрипты

Recommended Posts

Предлагаю поучаствовать в соревновании по составлению скриптов для командных оболочек и скриптовых интерпретаторов. Ломаем мозги и учимся :). Задачи имеют упор на практическое применение. Принимаются решения для интерпретаторов: sh, bash, csh, cmd(windows){для извращенцев}; awk, sed, perl. Скрипты не должны использовать какие-либо экзотические команды, если иное не оговорено в условии задачи. Для cmd допускается использование только тех команд, которые имеются в поставке Windows, для юниксов допускается использование команд из состава coreutils, findutils; bash, sh, csh, grep, awk, perl. Скрипты не должны требовать администраторских прав, если иное не оговорено в условии задачи.

 

Если у вас есть желание поучаствовать, но вы не знаете, с чего начать, то советую запастись руководствами по баш скриптингу (самый дружелюбный для новичка интерпретатор из списка выше), рабочим дистрибутивом линукс (новички часто выбирают убунту). Само собой, что установить ОС можно на любую виртуальную машину. Под виндовс существует проект cygwin, но я, если честно, не смог найти этой штуке практического применения кроме как для форвардинга иксов. Еще есть вот такая веб-консолька: http://bellard.org/jslinux/

 

Участвовать могут все пользователи форума, кроме проверяющих (пока что это только я).

 

За решения будут начисляться баллы:

1 балл - решение верное, но имеет изъяны, из-за которых отрабатывает не всегда верно.

2 балла - решение верное, но алгоритм является "костыльным", "сырым", вследствие чего повышается время исполнения, потребляемая память, нагрузка на процессор и т.п.

3 балла - верное решение.

За портабельный код, исполняемый на sh, cmd или на экзотических (sed, awk) интерпретаторах добавляется еще 1 балл. Обратите на это особое внимание, т.к. решения для bash и для sh могут быть совершенно одинаковыми, но между ними может быть разница в 1 балл.

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

 

Решения можно присылать только для открытых задач. Задача закрывается после того, как я получу как минимум 5 верных решений от участников. После того, как задача будет закрыта, ее номер будет зачеркнут, а под ней будут лучшие решения для различных интерпретаторов, присланные участниками (либо мое, если оно окажется лучше). После закрытия задачи будет написан пост, где будут опубликованы все присланные решения и комментарии к ним.

Решения присылать мне в ЛС. В сообщении необходимо указать номер задачи, интерпретатор, сам скрипт. Обязательно оформляйте скрипт в бб тег [code]. Если тема будет популярна, то потом мне придется найти помощника, т.к. у меня свободного времени мало. Я буду публиковать только те задачи, для которых у меня есть решение.

 

Задачи могут иметь следующие маркеры:

- задачи, которые следует решать только на юникс-системах.

[P] - задачи, связанные с разбором текстовых файлов (с парсингом). Практически во всех случаях придется использовать регулярные выражения. Команды среды unix, чаще всего используемые для разбора (по убыванию): grep, sed, awk, perl, cut, tr.

- необходимо оформить в виде исполняемого скрипта, а не команды.

[.] - очень легкая задача, за которую максимум можно получить 2 балла. (причем из них 1 балл за использование распространенных интерпретаторов)

[|] - средней сложности задача, за правильное решение которой вместо трех баллов дается 6, вместо двух баллов дается 3.

[!] - сложная задача, за правильное решение которой вместо трех баллов дается 10, вместо двух баллов дается 5.

 


Задачи

1. Найти MD5 хеш суммы файлов, содержащих в себе строку "Hello".

[spoiler=Выходные данные]Создадим набор файлов для проверки:

echo " " > 1
printf "Hello\nHelloHello" > 2
echo "" > 3
echo "gf Hello fg" > 4
echo "gfHellofg" > 5

 

Скрипт должен вывести хеш суммы файлов в формате md5sum:

09f7e02f1290be211da707a266f153b3  ./2
c0263682fe9654e23dc20f4d51474160  ./4
cf3756473ae372a959fa0f51edb2ac75  ./5

 

 

2. [|][P] Показать айпи адреса и количество неудачных попыток входа в систему через ssh (Парсим лог /var/log/auth.log. Его местоположение может отличаться, зависит от настроек syslogd: `grep auth /etc/*syslog.conf`. Считается, что пользователь, который исполняет скрипт, имеет право чтения логфайла). Обратите внимание, что адрес может быть не только IPv4, но и IPv6.

[spoiler=Выходные данные]Скрипт должен вывести список айпи адресов и их количество в порядке убывания. Например:

     12 64.185.229.236
     9 85.111.3.180
     9 64.185.226.120
     8 46.105.43.63
     8 130.204.189.67
     6 221.230.133.67
     6 220.181.105.76
...

 

 

3. [|] Вывести список путей, MD5 хеш сумму, дату последнего изменения, дату последнего доступа для файлов, дата последнего изменения которых больше или равно 1 недели.

[spoiler=Выходные данные]Создадим пустую папку, переключимся на нее, создадим файлы, имеющие дату последнего изменения 3 недели, 2 недели, 1 неделю и 2 дня назад:

touch -am -t `date --date="3 weeks ago" +"%Y%m%d%H%M.%S"` "3 wa"
touch -am -t `date --date="2 weeks ago" +"%Y%m%d%H%M.%S"` 2wa
touch -am -t `date --date="1 weeks ago" +"%Y%m%d%H%M.%S"` 1wa
touch -am -t `date --date="2 days ago" +"%Y%m%d%H%M.%S"` 2da

 

Формат строки вывода таков: "имя_файла: мд5_сумма (юникс_таймштамп_последнего_изменения|юникс_таймштамп_последнего_доступа)"

Скрипт должен вывести примерно следующее:

./3 wa: d41d8cd98f00b204e9800998ecf8427e (1348599723|1350414151)
./1wa: d41d8cd98f00b204e9800998ecf8427e (1349809323|1350414151)
./2wa: d41d8cd98f00b204e9800998ecf8427e (1349204523|1350414151)

 

 

4. [.] Упаковать в архив gz файлы, дата последнего изменения которых превышает 1 неделю. (Допускается использование команды gzip)

[spoiler=Описание]Создадим пустую папку, переключимся на нее, создадим файлы, имеющие дату последнего изменения 3 недели, 2 недели, 1 неделю и 2 дня назад:

touch -am -t `date --date="3 weeks ago" +"%Y%m%d%H%M.%S"` "3 wa"
touch -am -t `date --date="2 weeks ago" +"%Y%m%d%H%M.%S"` 2wa
touch -am -t `date --date="1 weeks ago" +"%Y%m%d%H%M.%S"` 1wa
touch -am -t `date --date="2 days ago" +"%Y%m%d%H%M.%S"` 2da

 

После исполнения скрипта файлы "3 wa", 2wa и 1wa должны исчезнуть, а вместо них должны появиться их заархивированные версии "3 wa.gz", 2wa.gz, 1wa.gz.

 

 

5. Отсортировать список строк по убыванию их длины.

[spoiler=Выходные данные]Создадим файл следующего содержания:

543:5jh43j5
gf hgfhghfhfghfh
3546hfhhfg
hgh
h
hfghfghjfhjfkhkgjh
fgh
hgh

 

После сортировки его содержимого скрипт должен вывести следующее:

hfghfghjfhjfkhkgjh
gf hgfhghfhfghfh
543:5jh43j5
3546hfhhfg
hgh
hgh
fgh
h

 

 

6. [|] Переименовать файлы исходя из даты последнего изменения.

[spoiler=Описание]Создадим пустую папку, переключимся на нее, создадим файлы, имеющие дату последнего изменения 3 недели, 2 недели, 1 неделю и 2 дня назад:

touch -am -t `date --date="3 weeks ago" +"%Y%m%d%H%M.%S"` "3 wa"
touch -am -t `date --date="2 weeks ago" +"%Y%m%d%H%M.%S"` 2wa
touch -am -t `date --date="1 weeks ago" +"%Y%m%d%H%M.%S"` 1wa
touch -am -t `date --date="2 days ago" +"%Y%m%d%H%M.%S"` 2da

 

Скрипт должен переименовать все файлы в данной папке в такой формат: ГОД-МЕСЯЦ-ЧИСЛО ЧАСЫ:МИНУТЫ:СЕКУНДЫ старое_имя_файла. Возможность совпадения нового имени файла и существующего можно не учитывать.

Список файлов должен получиться примерно таким:

2012-09-26 00:13:38 3 wa
2012-10-03 00:13:38 2wa
2012-10-10 00:13:38 1wa
2012-10-15 00:13:38 2da

 

 

7. [.] Определить количество файлов в текущей папке.

[spoiler=Выходные данные]Переключимся в пустую директорию, создадим одну папку и 8 файлов:

mkdir 1
touch 2 3 4 5 6 7 8 9

 

После исполнения скрипт должен вывести число 8.

 

 

8. [.] Вывести имя и размер файлов, созданных неделю назад.

[spoiler=Выходные данные]Переключимся в пустую директорию, создадим набор файлов:

echo "5445" > 2wa
touch -am -t `date --date="3 weeks ago" +"%Y%m%d%H%M.%S"` "3 wa"
touch -am -t `date --date="2 weeks ago" +"%Y%m%d%H%M.%S"` 2wa
touch -am -t `date --date="1 weeks ago" +"%Y%m%d%H%M.%S"` 1wa
touch -am -t `date --date="2 days ago" +"%Y%m%d%H%M.%S"` 2da

 

Формат вывода скрипта может быть любым, главное - наличие имени файла и его размера в одной строке, причем в одной строке может быть описан только один файл. Например, вот вывод скрипта в формате команды du:

0       ./3 wa
0       ./1wa
4.0K    ./2wa

 

 

9. [|][P] Определить количество вхождений подстроки в хтмл странице (но не в хтмл тегах!).

[spoiler=Описание]Поиск регистрозависимый, вхождение искомой строки в хтмл теги или комментарии не считать. Вхождение строки в содержание спрятанных хтмл тегов(имеющих display:none) игнорировать не обязательно, т.к. это требует полного разбора хтмл дерева и всех ксс файлов. Например, при поиске строки Shift со страницы forum.simhost.org скрипт должен вывести число 5 (на текущий момент).

 

 


Результаты


 

Если есть вопросы - не стесняйтесь спрашивать. Обсуждение задач тоже приветствуется, но просьба не публиковать сдесь свои решения, дабы не давать другим халявные баллы.

Edited by Shift
  • Like 2

Share this post


Link to post
Share on other sites

Вопрос, кто нибудь что-нибудь решил?Костя, ты не считается

Share this post


Link to post
Share on other sites

Вопрос, кто нибудь что-нибудь решил?Костя, ты не считается

Поискал в гугле, нашел команды, которые понадобятся в первом задании)

Share this post


Link to post
Share on other sites

7,8,9 будут легкими, чуть попозже добавлю. Десятая будет дикая, думаю что она будет очень долго висеть открытой :D

 

И кстати, посмотрите четвертую, она очень легкая. Ее даже нагуглить можно.

Share this post


Link to post
Share on other sites

Пичалька, но мне придется извращаться с cmd :D

Share this post


Link to post
Share on other sites

Нету у меня юникс :D

Share this post


Link to post
Share on other sites

Так подними на виртуалке. Можешь еще попытать удачи вот тут, вдруг получится найти рабочий шелл нахаляву.

 

Вот еще: http://sdf.org/?signup

Share this post


Link to post
Share on other sites

Думаю попозже подниму виртуалку. Проще.

Share this post


Link to post
Share on other sites

Кто-нибудь пытается решить? Подсказки нужны?

Share this post


Link to post
Share on other sites

Просьба, не выкладывать ответы. А просто прописать ник решившего задание. Времени пока не хватка, потом подумаю "Как? Да что?")

Share this post


Link to post
Share on other sites

Ну само собой:

После закрытия задачи будет написан пост, где будут опубликованы все присланные решения и комментарии к ним.

Решения присылать мне в ЛС. В сообщении необходимо указать номер задачи, интерпретатор, сам скрипт. Обязательно оформляйте скрипт в бб тег [code].

Share this post


Link to post
Share on other sites

Добавил задачи 8 и 9. Девятая получилась немного сложнее, чем я ожидал, ну да ладно, легких тоже много.

Если нужно, то я могу какую-нибудь среднюю по сложности задачу(не из списка выше) разобрать, чтобы было понятно что вообще должно из себя представлять решение.

Share this post


Link to post
Share on other sites

в шапке можно закрепить ссылку на jslinux http://bellard.org/jslinux/

это наиболее простой вариант попробовать выполнить задания

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×