Flex - wyrażenia regularne

Cel

Laboratorium ma na celu zapoznanie z generatorem skanerów flex (flex manual). Zadanie polega na wykorzystaniem flexa do stworzenia skanera plików crontab (crontab manual).

flex - wprowadzenie

Informacje na temat flexa.

crontab - wprowadzenie

Cron jest demonem zegarowym, który pozwala wywoływać polecenia o zadanych porach. Crona można konfigurować przy pomocy pliku w formacie crontab. Wpisy w takim pliku mają następujący układ:

         min godz dzien_miesiąca miesiąc dzien_tygodnia polecenie

Linia w pliku składa się z sześciu pól oddzielonych białymi znakami. Pięć pierwszych pól definiuje datę i czas następująco:

A oto kilka przykładów wpisów w crontab uruchamiających polecenia co jakiś czas:

co godzinę (minutę po pełnej godzinie)

1 * * * *    /etc/cron.hourly

codziennie (5 minut po północy)

5 0 * * *    /etc/cron.daily

co tydzień w niedziele o północy

0 0 * * 0    /etc/cron.weekly

raz w miesiącu, każdego pierwszego dnia miesiąca o północy

0 0 1 * *    /etc/cron.monthly

co 4 godziny

0  0,4,8,12,16,20  *  *  *    /usr/bin/webalizer

to samo zapisane w inny sposób

0 0-23/4  *  *  *    /usr/bin/webalizer

dnia 26.10 od godz. 18 przez 30 min z częstotliwością co minutę

0-30 18 26 10 *   /usr/bin/webalizer

Przykładowy plik testfile-crontab.

Zadanie

Przykładowo, skaner dla wejścia:

1 * * * 0  /etc/cron.hourly
0-30 18 26 10 *  /usr/bin/webalizer
0 0-23/4  *  *  *    /usr/bin/webalizer
0  0,4,8,12,16,20  *  *  *    /usr/bin/webalizer

ma wypisywać na wyjściu:

o kazdej godzinie minut 1, 
kazdego dnia miesiaca, 
kazdego miesiaca w roku, 
w niedziele
wykonaj /etc/cron.hourly

o godzinie 18 minut 0-30, 
//lub co 1 minute pomiedzy godzina 18 minut 0 i godzina 18 minut 30
26 dnia miesiaca, 
10 miesiaca w roku, 
kazdego dnia tygodnia 
wykonaj /usr/bin/webalizer

o godzinie 0-23/4 minut 0, 
//lub co 4 godziny pomiedzy godzina 0 minut 0 i godzina 23 minut 0
kazdego dnia miesiaca, 
kazdego miesiaca w roku, 
kazdego dnia tygodnia 
wykonaj /usr/bin/webalizer

o godzinie 0,4,8,12,16,20 minut 0, 
kazdego dnia miesiaca, 
kazdego miesiaca w roku, 
kazdego dnia tygodnia 
wykonaj /usr/bin/webalizer

W przypadku pojawienia się linii o nieprawidłowym formacie powinnen być wypisany komunikat o błędzie, wraz z numerem linii, w której błąd wystąpił i kontynuowane przetwarzanie. Linia zawierająca informację o błędzie może zawierać również informacje o wcześniejszych poprawnych wpisach (np. o godzinie 12 minut 30, Błąd w linii 5.)

Proszę przyjąć, że część nazwana polecenie (patrz opis crontab-a) to dowlony ciąg znaków. Pomiędzy poszczególnymi polami pojawia się jeden lub więcej biały znak (spacja lub tabulator). Możliwe są konstrukcje typu 1,3-5 dla pierwszych pięciu pól. Dla uproszczenia nie trzeba (ale można) sprawdzać czy w zapisie 0-30 pierwszy element jest mniejszy od drugiego, ale obie wartosci powinny być z zakresu danego pola (np. dla minut z zakresu 0-59).

Materiały dodatkowe

Lex - A Lexical Analyzer Generator, M. E. Lesk,
Flex - manual po polsku,
Flex, version 2.5 - A fast scanner generator.