Перейти к содержимому
  • Объявления

    • st1nc

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

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

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

Рекомендованные сообщения

Предлагаю поучаствовать в соревновании по составлению скриптов для командных оболочек и скриптовых интерпретаторов. Ломаем мозги и учимся :). Задачи имеют упор на практическое применение. Принимаются решения для интерпретаторов: 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 (на текущий момент).

 

 


Результаты


 

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

Изменено пользователем Shift
  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


×