Практическая работа - парсинг текстовых файлов
Задания к работе
Необходимо написать shell-скрипт, который обработает текстовый файл log.txt в формате Acсess log веб-сервера Apache и выведет в консоль информацию, которая описана в секции “Расшифровка”. Этот скрипт должен использовать стандартные инструменты shell (которые включают такие утилиты, как: cut, grep, sort, awk, date и др.), но не использовать другие языки программирования, такие как C, Perl, Python и др.
Файл состоит из записей, каждая из которых занимает одну строку.
Пример записи:
1
host-24-225-218-245.patmedia.net - - [01/Oct/2006:06:33:45 -0700] "GET /example/example.atom HTTP/1.1" 304 - "-" "NetNewsWire/2.0b37 (Mac OS X; Lite; http://ranchero.com/netnewswire/)"
Формат записи:
1
<хост клиента> - - [<Штамп времени с временной зоной>] <Строка HTTP-запроса (тип, URL, версия)> <Код HTTP ответа> <Количество переданных байт или '-', если ответ не имеет тела> <Строка реферера ('-' означает прямой запрос без реферера)> <Название клиента (браузер)>
Пример расшифровки:
1
01/Oct/2006:06:33:45 -0700 с хоста host-24-225-218-245.patmedia.net по протоколу HTTP/1.1 был выполнен запрос типа GET для получения ресурса, находящегося по ссылке /example/example.atom. Код ответа на запрос от сервера: 304. Такой ответ не предполагает наличия тела ответа (количество переданных байт - 0). Запрос выполнялся напрямую, а не по ссылке с другого сайта (поле реферер - пустое). Клиент использовал для обращения программу NetNewsWire/2.0b37, ОС клиента: Mac OS X
Заания для самостоятельного выполнения
- Модифицируйте программу так, чтобы ей можно было передать один (необязательный) параметр, в котором указать код завершения операции. При указании этого параметра, программа фильтрует содержимое файла и выводить только те строчки, которые имеют именно этот код процесса.
- Добавьте в программу возможность указывать ключи (количество и наименования по вашему усмотрению) для фильтрации данных по любому полю.
- Дополнительно оценивается корректная работа программы с несколькими ключами одновременно.