Практическая работа №3. Фильтрация вывода

Опубликовано пользователем Бессонов Л.В. 11.11.2009г.

Цель работы

Научиться использовать фильтры по регулярным выражениям

Теоретические материалы

  1. Утилита grep - фильтрация по шаблону
  2. Регулярные выражения

Выполнение работы

Возможность обрабатывать информацию с использованием регулярных выражений представляют собой одно из наиболее полезных свойств программ операционных систем семейства *nix. Регулярные выражения являются языком описания текстовых шаблонов, который используется во многих системных утилитах для выполнения операций поиска и отбора при разнообразных обработках текстовых строк. Мы начинаем изучать регулярные выражения с применения их в утилите поиска grep.

В каталоге http://nto.immpu.sgu.ru/p3/ имеются пять текстовых файлов с именами query1, query2, query3, query4 и query5. Файлы содержат структурированный текст. Структура файлов следующая:

Структура файла query1Схема 1. Структура файла query1

Структура файла query2Схема 2. Структура файла query2

Структура файла query3Схема 3. Структура файла query3

Структура файла query4Схема 4. Структура файла query4

Структура файла query5Схема 5. Структура файла query5

Используя команду grep, выполните поиск в файлах строк, соответствующих определенным критериям. Имена исходных файлов и критерии поиска приводятся в Вашем варианте индивидуального задания. Используя команду grep, выполните поиск в файлах строк, соответствующих определенным критериям. Имена исходных файлов и критерии поиска приводятся в Вашем варианте индивидуального задания.

Варианты заданий

Вариант 1

  • В файле query1 выбрать все строки, в которых имя сотрудника начинается на букву 'R'.
  • В файле query3 выбрать все строки, в которых в названии есть слово 'TENNIS', а цена установлена в 1990 г.
  • В файле query4 выбрать все строки, в которых фамилия продавца - 'DUNCAN'.

Вариант 2

  • В файле query4 выбрать все строки, в которых код покупателя - 201.
  • В файле query2 выбрать все строки, в которых индекс начинается с '11'.
  • В файле query3 выбрать все строки, в которых минимальная цена не меньше 10

Вариант 3

  • В файле query1 выбрать все строки, в которых фамилия сотрудника начинается на букву 'M'.
  • В файле query4 выбрать все строки, в которых сумма не имеет копеек.
  • В файле query3 выбрать все строки, в которых минимальная цена меньше 10, а максимальная цена не меньше 10.

Вариант 4

  • В файле query4 выбрать все строки, в которых фамилия продавца заканчивается буквой 'N'.
  • В файле query1 выбрать все строки, в которых должность - 'MANAGER', а отдел - 'SALES'.
  • В файле query3 выбрать все строки, в которых максимальная цена не меньше 20.

Вариант 5

  • В файле query1 выбрать все строки, в которых код заканчивается цифрами '69'.
  • В файле query2 выбрать все строки, в которых в названии есть 'SPORT'.
  • В файле query4 выбрать все строки, в которых сумма не меньше от 1000, но меньше 2000.

Вариант 6

  • В файле query3 выбрать все строки, в которых код заканчивается цифрой '1'.
  • В файле query2 выбрать все строки, в которых в адресе номер дома - '2'.
  • В файле query2 выбрать все строки, в которых кредит не меньше 10000.

Вариант 7

  • В файле query2 выбрать все строки, в которых код заканчивается цифрой '8'.
  • В файле query4 выбрать все строки, в которых N заказа не содержит цифры '4'.
  • В файле query1 выбрать все строки, в которых зарплата меньше 1000.

Вариант 8

  • В файле query1 выбрать все строки, в которых первый инициал - 'K', а второй - 'J'.
  • В файле query3 выбрать все строки, в которых минимальная цена равна 15, а максимальная цена - 20.
  • В файле query1 выбрать все строки, в которых должность - 'MANAGER', а город - 'NEW YORK'.

Вариант 9

  • В файле query4 выбрать все строки, в которых N заказа заканчивается цифрой '4'.
  • В файле query3 выбрать все строки, в которых в названии есть слово 'TENNIS', а цена установлена в 1990 г.
  • В файле query2 выбрать все строки, в которых номер дома не меньше 1000.

Вариант 10

  • В файле query1 выбрать все строки, в которых средний инициал - 'M'.
  • В файле query3 выбрать все строки, в которых цена установлена в январе или феврале любого года.
  • В файле query4 выбрать все строки, в которых сумма не меньше 10000.

Вариант 11

  • В файле query2 выбрать все строки, в которых штат - 'MA'.
  • В файле query3 выбрать все строки, в которых в коде есть два или больше 0 подряд.
  • В файле query1 выбрать все строки, в которых фамилия начинается на букву 'M', а зарплата меньше 1000.

Вариант 12

  • В файле query2 выбрать все строки, в которых город - 'DALLAS'.
  • В файле query4 выбрать все строки, в которых код начинается с цифры '5', а сумма заказа содержит копейки.
  • В файле query1 выбрать все строки, в которых зарплата находится в пределах от 2000 до 2999.

Вариант 13

  • В файле query1 выбрать все строки, в которых город - не 'NEW YORK'.
  • В файле query3 выбрать все строки, в которых цена установлена в 1990 г.
  • В файле query2 выбрать все строки, в которых в названии улицы есть цифры.

Вариант 14

  • В файле query3 выбрать все строки, в которых в названии есть латинские цифры.
  • В файле query4 выбрать все строки, в которых дата продажи - 1-е число любого месяца и года.
  • В файле query1 выбрать все строки, в которых должность - не 'SALESPERSON'.

Вариант 15

  • В файле query2 выбрать все строки, в которых номер телефона начинается с '555'.
  • В файле query3 выбрать все строки, в которых в названии есть текст, взятый в кавычки, а в нем - слово 'GUIDE'.
  • В файле query4 выбрать все строки, в которых сумма содержит целое число сотен.

Требования к содержанию отчёта

Отчёт должен содержать три команды grep (с соответствующими индивидуальным заданиям регулярными выражениями), а также листинги отработки этих команд.

Пример выполнения задания

Задание 1

В файле query2 выбрать все строки, в которых в адресе есть улица ("ST.").

Решение:

  1. Адрес в файле query2 начинается с 31-й позиции (см. структуру файла). Поэтому нужно прежде всего пропустить 30 позиций от начала файла, что можно сделать таким подвыражением: "^.\{30\}" - 30 любых символов от начала файла.
  2. Улица обозначается в адресе сокращением "ST.", и эта подстрока может стоять в адресе на любом месте, то есть перед ней могут быть и другие символы. Поскольку общая длина адреса - не более 20 символов, перед подстрокой, которую мы ищем, может быть не более 17 любых символов, что определяется подвыражением: ".*\{0,17\}".
  3. Наконец, следует указать подстроку, которую мы ищем: "ST.". Поскольку в подстроку входит метасимвол "." (точка), подвыражение для поиска вхождения будет иметь вид: "ST\.".
  4. Итоговое регулярное выражение:
        "^.\{31\}.*\{0,17\}ST\."
    
  5. Протокол выполнения:
student@r111wslin01 ~ $ grep "^.\{31\}.*\{0,17\}ST\." query2
203:REBOUND SPORTS            :2 E. 14TH ST.        :NEW-YORK       :NY:10009:5555989:10000
205:POINT GUARD               :20 THURSTON ST.      :YONKERS        :NY:10956:5554766:3000
211:AT BAT                    :234 BEACHEM ST.      :BROOKLINE      :MA:02146:5557385:8000
212:ALL SPORT                 :1000 38TH ST.        :BROOKLYN       :NY:11210:5551739:6000
213:GOOD SPORT                :400 46TH ST.         :SUNNYSIDE      :NY:11104:5553771:5000
214:AL'S PRO SHOP             :45 SPRUCE ST.        :SPRING         :TX:77388:5555172:8000
223:VELO SPORTS               :23 WHITE ST.         :MALDEN         :MA:02148:5554983:5000
228:FITNESS FIRST             :5000 85TH ST.        :JACKSON-HEIGHTS:NY:11372:5558710:4000
student@r111wslin01 ~ $ 

Задание 2

В файле query1 выбрать все строки, в которых зарплата составляет целое число тысяч.

Решение 1:

  1. Согласно структуре файла, столбец зарплаты начинается с позиции 60, поэтому - подвыражение: "^.\{59\}".
  2. Если зарплата составляет целое число тысяч, то в ней содержится одна или несколько цифр, за которыми следует три нуля - подвыражение: "[0-9]\{1,\}000".
  3. Однако возможна (теоретически) зарплата, например "10001", поэтому стоит позаботиться о том, чтобы следующие за тремя нулями символы были отличны от значащих цифр. Таких символов может быть сколько угодно, и это условие можно обеспечить подвыражением: "[^0-9]*".
  4. Итоговое регулярное выражение:
        "^.\{59\}[0-9]\{1,\}000[^0-9]*"
    
  5. Протокол выполнения:
student@r111wslin01 ~ $ grep "^.\{59\}[0-9]\{1,\}000[^0-9]*" query1
7569 CHRIS     L ALBERTS   MANAGER     RESEARCH   NEW-YORK 3000
7788 DONALD    T SCOTT     ANALYST     RESEARCH   DALLAS   3000
7799 MATTHEW   G FISHER    ANALYST     RESEARCH   NEW-YORK 3000
7839 FRANCIS   A KING      PRESIDENT   ACCOUNTING NEW-YORK 5000
7902 JENNIFER  D FORD      ANALYST     RESEARCH   DALLAS   3000
student@r111wslin01 ~ $

Решение 2:

  1. Поскольку зарплата является последним полем строки файла query1, возможно, можно просто потребовать, чтобы три нуля были последними символами строки и сформулировать регулярное выражение таким образом: "000$". Однако, такое решение может наткнуться на неочевидное препятствие. Все зависит от того, какими средствами был подготовлен исходный файл query1 (особенно, если он был перенесен из другой системы).
    Дело в том, что разные программы и редакторы используют разные способы перевода строки, и в конце строки могут оказаться некоторые дополнительные (невидимые "невооруженным глазом" символы. Таким образом, последний 0 в зарплате может еще не быть последним символом строки. Как правило, увидеть эти дополнительные символы можно, выполнив команду cat с опцией -v. В этом случае на выдаче команды cat можно увидеть непечатный символ, показываемый, например, как: "^M".
  2. Следующие протокол иллюстрирует этот случай:
student@r111wslin01 ~ $ grep "000$" query1
student@r111wslin01 ~ $ cat -v query1
7369 JOHN      Q SMITH     CLERK       RESEARCH   DALLAS   800^M
7499 KEVIN     J ALLEN     SALESPERSON SALES      CHICAGO  1600^M
7505 JEAN      K DOYLE     MANAGER     SALES      NEW-YORK 2850^M
7506 LYNN      S DENNIS    MANAGER     SALES      DALLAS   2750^M
7507 LESLIE    D BAKER     MANAGER     OPERATIONS NEW-YORK 2200^M
7521 CYNTHIA   D WARD      SALESPERSON SALES      CHICAGO  1250^M
7555 DANIEL    T PETERS    SALESPERSON SALES      NEW-YORK 1250^M
7557 KAREN     P SHAW      SALESPERSON SALES      NEW-YORK 1250^M
7560 SARAH     S DUNCAN    SALESPERSON SALES      DALLAS   1250^M
7564 GREGORY   J LANGE     SALESPERSON SALES      DALLAS   1250^M
7566 TERRY     M JONES     MANAGER     RESEARCH   DALLAS   2975^M
7569 CHRIS     L ALBERTS   MANAGER     RESEARCH   NEW-YORK 3000^M
7600 RAYMOND   Y PORTER    SALESPERSON SALES      NEW-YORK 1250^M
7609 RICHARD   M LEWIS     STAFF       OPERATIONS DALLAS   1800^M
7654 KENNETH   J MARTIN    SALESPERSON SALES      CHICAGO  1250^M
7676 DENISE    D SOMMERS   STAFF       OPERATIONS CHICAGO  1850^M
7698 MARION    S BLAKE     MANAGER     SALES      CHICAGO  2850^M
7782 CAROL     F CLARK     MANAGER     ACCOUNTING NEW-YORK 2450^M
7788 DONALD    T SCOTT     ANALYST     RESEARCH   DALLAS   3000^M
7789 LIVIA     N WEST      SALESPERSON SALES      DALLAS   1500^M
7799 MATTHEW   G FISHER    ANALYST     RESEARCH   NEW-YORK 3000^M
7820 PAUL      S ROSS      SALESPERSON SALES      BOSTON   1300^M
7839 FRANCIS   A KING      PRESIDENT   ACCOUNTING NEW-YORK 5000^M
7876 DIANE     G ADAMS     CLERK       RESEARCH   DALLAS   1100^M
7900 FRED      S JAMES     CLERK       SALES      CHICAGO  950^M
7902 JENNIFER  D FORD      ANALYST     RESEARCH   DALLAS   3000^M
7916 GRACE     M ROBERTS   ANALYST     RESEARCH   NEW-YORK 2875^M
7919 MICHAEL   A DOUGLAS   CLERK       RESEARCH   NEW-YORK 800^M
7934 BARBARA   M MILLER    CLERK       ACCOUNTING NEW-YORK 1300^M
7950 ALICE     B JENSEN    CLERK       SALES      NEW-YORK 750^M
7954 JAMES     T MURRAY    CLERK       SALES      DALLAS   750^M
student@r111wslin01 ~ $

Решение 3:

  1. Уточним логику предыдущего решения, оказавшегося неправильным. За тремя нулями перед концом строки может следовать (а может и не следовать) еще один символ, отличный от значащей цифры:
        "000[^0-9]\{0,1\}"
    
  2. Протокол выполнения:
student@r111wslin01 ~ $ grep "000[^0-9]\{0,1\}" query1
7569 CHRIS     L ALBERTS   MANAGER     RESEARCH   NEW-YORK 3000
7788 DONALD    T SCOTT     ANALYST     RESEARCH   DALLAS   3000
7799 MATTHEW   G FISHER    ANALYST     RESEARCH   NEW-YORK 3000
7839 FRANCIS   A KING      PRESIDENT   ACCOUNTING NEW-YORK 5000
7902 JENNIFER  D FORD      ANALYST     RESEARCH   DALLAS   3000
student@r111wslin01 ~ $

Задание 3

В файле query4 выбрать все строки, в которых дата продажи - весна 1990 г.

Решение:

  1. По структуре файла query4 видно, что дата представляется достаточно легко распознаваемым способом: год-месяц-число, таким образом, при поиске даты, удовлетворяющей нашим требованиям можно не привязываться к определенным позициям в строке, а просто искать выражение вида: "[0-9]-весенний_месяц-[0-9]".
  2. Как распознать весенний_месяц? Весенние месяцы - "MAR", "APR", "MAY". Первая буква весеннего месяца должна быть "M" или "A", вторая - "A" или "P", третья - "R" или "Y". Из этих букв можно сложить буквосочетания, обозначающие весенние месяцы, а все другие возможные буквосочетания не являются обозначениями месяцев вообще. Таким образом, шаблон для распознавания весеннего месяца будет: "[MA][AP][RY]".
  3. Итоговое регулярное выражение:
        "[0-9]-[MA][AP][RY]-[0-9]"
    
  4. Протокол выполнения:
student@r111wslin01 ~ $ grep "[0-9]-[MA][AP][RY]-[0-9]" query4
620 TURNER 100 12-MAR-91 4450
526 WEST   221 04-MAR-90 7700
555 WEST   221 04-MAR-91 8540
528 WEST   224 24-MAR-90 3770
558 WEST   224 31-MAR-91 1700
503 SHAW   201 25-MAR-89 1876
562 SHAW   203 04-MAY-91 2044.5
536 SHAW   206 21-MAY-90 2135.6
561 ROSS   207 20-APR-91 2558.3
506 DUNCAN 208 27-APR-89 2600.4
530 DUNCAN 208 03-APR-90 3026.5
557 DUNCAN 208 08-MAR-91 2461.8
student@r111wslin01 ~ $
Прикрепленный файлРазмер
sq1.gif3.09 кб
sq2.gif3.9 кб
sq3.gif3.11 кб
sq4.gif2.31 кб
sq5.gif2.76 кб

Баннер SGU.RU