65842

Основы работы с текстовым редактором AWK и языком программирования Perl

Лабораторная работа

Информатика, кибернетика и программирование

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

Русский

2014-08-09

52.5 KB

0 чел.

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

—————————

Кафедра информационной безопасности компьютерных систем

ОТЧЕТ

по лабораторной работе №2

«Основы работы с текстовым редактором AWK и языком программирования Perl»

по курсу «Операционные системы»

Студент:

Никитин А. С.

гр. 2088/1

Преподаватель:

Степанова Т. В.

Санкт-Петербург — 2011

1. Формулировка задания

Цель работы — изучение возможностей, предоставляемых интерактивным текстовым редактором AWK из состава ОС UNIX, а также ознакомление с языком программирования Perl.

2. Использованные теоретические сведения

3. Результаты работы

3.1. Выполнение примеров

3.2. Выполнение индивидуального задания

  1.  Разработать Perl скрипт для анализа готового файла журнала аудита.
    #!/usr/bin/perl
    open(LOG, "<$ARGV[0]") || die "File not found!"; #Открытие файла
    @
    log = <>; #Чтение содержимого в массив
    close(LOG);
    @
    logdate = sort @log; #Сортировка массива по дате
    print "By time:\n";
    foreach $line (@logdate) {
       
    if ($line ne $prev) { #Если строка не равна предыдущей...
        #(удаление одинаковых строк)
           $
    prev = $line;
           
    print "$line";
           $
    line =~ s/\n//g; #Убираются переводы строки
           ($
    date, $time, $user, $type, $param) = split '\t', $line;
         #Строка разбивается на поля
           
    if ($date ne $pdate) { #Если поле дата не равна
         #предыдущему значению
               $
    days++;   #Увеличивается счётчик дней
               $
    pdate = $date;
           }
           $
    tp{$type} = $tp{$type}.$line."\n"; #Строка добавляется
      #к элементу хэша, содержащего события её типа
           $
    us{$user}++; #Увеличивается счётчик действий пользователя
           $
    lon++ if $type eq "logout"; #Если событие – logout,
          #увеличивается счётчик
       }
    }
    print "\nBy types:\n";
    while (($type, $line) = each(%tp)) { #Вывод событий по типу
       
    print "$type\n$line";
    }
    print "\nUsers:\n";
    while (($u, $n) = each(%us)) { #Вывод количества событий пользователя
       
    print "$u - $n\n";
    }
    print "\nLogouts: $lon\n"; #Вывод количества событий logout
    print "\nDifferent days: $days\n"; #Вывод количества различных дней
  2.  Проделать вышеприведенное задание с помощью редактора AWK.
    BEGIN {
       
    FS = "\t"; #Установка разделителя полей
    }
    {
       
    x[NR] = $0; #Считывание фала в массив
       
    n++;
    }
    END {
       
    print "Events by date"
       
    for (i = 1; i <= n; i++) { #Сортировка событий по дате
           
    for (j = 1; j < n; j++) {
               
    if (x[j] > x[j + 1]) {
                   
    t = x[j];
                   
    x[j] = x[j + 1];
                   
    x[j + 1] = t;
               }
           }
       }
       
    for (i = 1; i <= n; i++) { #Вывод событий
           
    if (x[i] != prev) { #Удаление дублирующихся событий
               
    ni++;
               
    f[ni] = x[i]; #Массив fi будет содержать журнал
        #без дубликатов событий
               
    prev = x[i];
               
    print x[i];
               
    split (x[i], a); #Разделение строки на поля
               
    if (a[1] != pdate) { #Если дата не равна предыдущей
                   
    days++; #Увеличиваем количество различных дней
                   
    pdate = a[1];
               }
           }
       }
       
    print "\nEvents by type"
       
    for (i = 1; i <= ni; i++) { #Сортировка событий по типу
           
    for (j = 1; j < ni; j++) {
               
    split(f[j], a1);
               
    split(f[j + 1], a2);
               
    if (a1[4] > a2[4]) {
                   
    t = f[j];
                   
    f[j] = f[j + 1];
                   
    f[j + 1] = t;
               }
           }
       }
       
    prev = "";
       
    for (i = 1; i <= ni; i++) {
           
    split(f[i], a);
           
    us[a[3]]++; #Подсчёт событий по пользователям
           
    if (a[4] == "logout") lg++; #Подсчёт событий типа logout
           
    if (a[4] != prev) {
               
    print a[4];
               
    prev = a[4];
           }
           
    print f[i];
       }
       
    print "\nUsers"
       
    for (i in us) print i " - " us[i]; #Вывод количества событий
          #пользователя
       
    print "\nLogouts: " lg; #Вывод количества событий типа logout
       
    print "\nDifferent days: " days; #Вывод количества различных
          #дней
    }
  3.  Используя скриптовый язык Perl, разработать программу, которая осуществляет просмотр текущего каталога и выводит на экран его содержимое группами в порядке уменьшения числа ссылок на файлы (в том числе имена каталогов).
    #!/usr/bin/perl
    open(LS, "ls -l|grep -v 'итого'|") || die "Error!"; #Получение списка
            #файлов
    @
    ls = <LS>; #Считывание в массив
    close(LS);
    foreach $rec (@ls) { #Для каждой записи
       ($
    dir, $lnum, $b, $c, $d, $e, $f, $name) = split '[ \n]+', $rec;
     #Разделение на поля
       $
    dir =~ s/[-rwx]//g; #Получение строки, содержащей d, если это
        #каталог
       $
    recn[$i] = $lnum."\t".$dir."\t".$name."\n"; #Получение строки
     #вида “количество ссылок\
    td, если каталог\tимя”
       $
    i++;
    }
    @
    sr = sort {$b cmp $a} @recn; #Сортировка в обратном порядке
    $
    prev = "";
    foreach $rec (@sr) {
       ($
    a, $b) = split '\t+', $rec;
       
    if ($a ne $prev) { #Вывод заголовка группы файлов и каталогов
           print "~~~$a~~~\n";
           $prev = $a;
       }
       print $rec; #Вывод строки
    }

3.3. Ответы на контрольные вопросы

  1.  Какие управляющие конструкции доступны при программировании в AWK?
    if-else, while и for.
  2.  Для чего в Perl используются операторы привязки?
    Операторы привязки используются для совершения над строками операций по шаблонам. Например, поиск и замена участка строки, совпавшего с регулярным выражением.
  3.  В каких ситуациях в Perl используются операторы ограничители строк?
    Используются при обработке текста с помощью регулярных выражений.

4. Выводы

AWK – удобное средство для форматирования и составления статистики по текстовым файлам. В целом имеет принцип работы скриптов схожий с SED, однако предоставляет большие возможности по их написанию.
Perl – полноценный язык программирования общего назначения, однако чаще всего он используется для обработки текстов, так как содержит огромное количество средств для этого.

Приложение

Исходные тексты программ


 

А также другие работы, которые могут Вас заинтересовать

69746. Структурне програмування 35.5 KB
  Мета структурного програмування створювати програми чіткої структури тобто такі які можна було б без великих затрат розуміти супроводжувати і модифікувати без участі авторів оскільки на сучасному етапі затрати на супровід і модифікацію програм становлять...
69747. Перелічуваний тип 30.5 KB
  Стандартні типи змінних, як відомо, мають значення, що є елементами з підмножини цілих, дійсних чисел, логічних значень (true або false) або множини символів обчислювальної системи (наприклад ASCII). Проте часто доводиться стикатися з поняттями, які можуть набувати специфічних...
69748. Оператор безумовного переходу 24 KB
  Розглянутий умовний оператор if-then-else вибирає один з двох можливих напрямів виконання програми залежно від виконання умови. Інакше його називають оператором умовного переходу. В програмі може виникнути потреба перейти до ви конання деякого відрізка програми незалежно від жодної умови.
69749. Модуль Dos 21 KB
  Dos дозволяє обмінюватися інформацією з операційною системою. Системний час переривання стани параметрів оточення процедури обробки процесів робота з дисковим простором всім цим займається модуль Dos. Модуль Dos і WinDos Модулі Dos і WinDos реалізують численні процедури і функції...
69750. Параметри-змінні 25 KB
  Для того, щоб результат обчислень у тілі процедури зручно було використати в програмі, треба не фіксувати змінну, якій присвоюється одержане значення, а зробити її також параметром. Позначимо цю змінну, наприклад, res і введемо її в список формальних параметрів процедури.
69751. Принцип локалізації 38 KB
  Метод покрокової деталізації та апарат процедур якраз і дають змогу вести таку паралельну розробку програм. Створені часткові алгоритми подають у вигляді досить автономних частин програми - описів процедур, які потім достатньо вставити в розділ опису процедур і функцій програми.
69752. Параметри-процедури і параметри-функції 28.5 KB
  Як формальні параметри в мові Паскаль, крім параметрів-значень і параметрів-змінних, використовують також імена процедур і функцій. Параметри-процедури в списку формальних параметрів в авторській версії Паскаль зазначають після службового слова procedure.
69753. Перетворення типів 28.5 KB
  Однак Турбо Паскаль допускає в певних межах такі перетворення які треба задавати в явному вигляді. Є три способи задавати перетворення типів: неявні перетворення використання стандартних функцій і явні перетворення.
69754. Вставляння заданого елемента 27.5 KB
  Заданий елемент у рядок вставлятимемо за вказівкою на ланку, після якої він повинен бути. Нехай початковий динамічний рядок має вигляд, показаний на рис. 11.3. Після В треба вставити D. Цей випадок схематично зображено на рис...