Сімейство програм grep

Програма grep була згадана в розділі 1 і з тих пір неодноразово використовувалася в прикладах

$ grep шаблон імена5файлов ..

переглядає вказані файли або стандартний ввід і виводить всі рядки, що містять зразок Програма незамінна при пошуку змінних в програмах, слів у документах або у вихідних даних якої-небудь програми

$ grep-n variable * [ch] Знайти variable в програмах на Сі

$ grep From $ MAIL Надрукувати заголовки поштових повідомлень

$ grep From $ MAIL | grep-v mary Заголовки повідомлень,

що не належатьmary

$ grep-y mary $ HOME / lib / phone-book Знайти телефонний номер mary

$ who | grep mary Зареєструвалася чи mary  в системі

$ ls | grep-v temp Імена файлів, що не містять temp

Параметр-n виводить номери рядків,-v змінює умова на протилежне, а-y встановлює відповідність символів нижнього регістру у зразку символам обох регістрів у файлі (символи верхнього регістру як і раніше відповідають тільки верхнього регістру)

Досі у всіх прикладах програма grep виконувала пошук звичайних рядків, що складаються з букв і цифр Але насправді вона може знаходити і складніші зразки: grep може інтерпретувати вирази на простій мові опису рядків

З технічної точки зору шаблони є обмеженим вари антом описателей рядків, відомих як регулярні вирази Програма grep інтерпретує ті ж регулярні вирази, що і редактор ed фактично вона була створена з нього (всього за один вечір) шляхом «хірургічного втручання»

Регулярні вирази утворюються привласненням спеціальних зна чений певним символам, таким, наприклад, як *, які ис-

користуються оболонкою Існує ще кілька метасимволов, мають, на жаль, різночитання в застосуванні Розглянемо їх коротко (список всіх метасимволов, що використовуються в регулярних виразах, наведено в табл 41)

Таблиця 41 Регулярні вирази grep і egrep (у порядку зниження пріоритету)

Метасимволи

Значення

c

\c

^

$

[..]

[^..]

\n r* r+ r

r1r2  r1|r2

\(r\) (r)

будь-який не спеціальний символ c збігається сам з собою відключає всі спеціальні значення символу c початок рядка

кінець рядка

довільний одиночний символ

будь-який з символів безлічі ..; допустимі діапазони, наприклад a-z

будь-який символ, який не входить до ..; допустимі діапазони те ж, що в n-Му фрагменті \ (.. \) (тільки grep)

нуль або більше входжень r

одне або більше входжень r (Тільки egrep) нуль або одне входження r (Тільки egrep)

r2 слід за r1

r1 або r2 (Тільки egrep)

регулярний виразr з тегами (тільки grep) може бути вкладеним

регулярний вираз r (Тільки egrep) може бути вкладеним не існує регулярного виразу, відповідного

символу нового рядка

Метасимволи ^ і $ «привязують» шаблон до початку або кінця рядка відповідно Наприклад, вираз

$ grep  From  $MAIL

знаходить в повідомленнях рядки, що містять зразок From, а

$ grep  ’^From’ $MAIL

вибере тільки ті рядки, які починаються з From, а значить, швидше за все, знаходяться в заголовку повідомлення Метасимволи регулярних виразів перекриваються метасимвол оболонки, тому пара метр команди grep рекомендується укладати в одинарні лапки

Програма grep, як і оболонка, підтримує «класи символів», так що [a-z] відповідає будь букві нижнього регістру Але є й

відмінності: якщо клас символів починається зі знака ^, то шаблоном відповідають всі символи, крімналежать класу Отже, висловом [^ 0-9] відповідають всі символи, які не є цифрами Крім того, в оболонці символ \ перед символами] і – озна чає, що вони входять в клас, тоді як програми grep і ed вимагають, щоб ці символи використовувалися там, де виключена двозначність Наприклад, послідовність [] [-] (це важливо) Відповідає відкриває і закриває квадратним дужках і знаку мінус

Знак (Точка) еквівалентний знаку питання в оболонці, він відповідає будь-якому символу (Мабуть, точка – це знак, що має найбільше різних значень у різних програмах для UNIX) Ось пара прикладів:

$ ls-l | grep ^ d Список підкаталогів

$ ls-l | grep ^ …… rw Файли, доступні іншим для читання і запису

Знак ^ і наступні за ним сім точок відповідають семи довільним символам на початку рядка у разі застосування до вихідного потоку команда ls-l задає рядок прав доступу

Оператор замикання (closure) * Діє на попередній символ або метасимвол (включаючи і клас символів) у вираженні, така конструкція відповідає довільному числу наступних один за одним символів, заданих у зразку Наприклад, x * визначає послідовність символів x максимально можливої ​​довжини, [a-zA-Z] * визначає рядок з літер, * Відповідає рядку будь-яких символів, а

. * X – рядку довільних символів, що закінчується символом x, включаючи цей останній символ

Відзначимо дві важливі особливості замикання По-перше, оператор замикання діє тільки на один символ, так що xy * відповідає кільком символам y, наступним за символом x, а не рядку виду xyxyxy По-друге, «довільну кількість» включає нуль, тому, якщо необхідний хоча б один символ, треба вказувати його окремо Наприклад, правильне вираз для визначення буквеної рядка виглядає так: [a-zA-Z] [a-zA-Z] * (буква і наступні за нею нуль або більше літер) Шаблонний символ * для імені файлу в оболоч ке – це те ж, що і регулярний вираз *

У grep немає регулярного виразу, яке відповідало б симво лу нового рядка, кожен рядок обробляється окремо

Разом з регулярними виразами grep являє собою просту мову програмування Згадаймо, наприклад, що зашифрований пароль знаходиться у другому полі файлу паролів Для пошуку користувачів, не мають пароля, введемо команду:

$ grep  ’^[^:]*::’ /etc/passwd

Це означає: початок рядка, довільну кількість «недвоеточій», дві двокрапки

Програма grep – найстаріший член сімейства, в якому пізніше зявилися fgrep і egrep Сутність їх роботи однакова, за винятком того, що fgrep виконує пошук одночасно декількох рядків, a egrep інтерпретує істинні регулярні вирази так само, як grep, але з використанням оператора АБО і дужок, що дозволяють групувати вираження, як це описано нижче

Обидві команди дозволяють за допомогою параметра-f вказати файл, що містить шаблон У файлі можуть перебувати кілька шаблонів, кожен на окремому рядку, пошук по яким виконується паралельно Наприклад, якщо ви часто робите помилки в одних і тих же словах, то можете зберегти їх у файлі, по одному в кожному рядку, і за допомогою fgrep перевіряти їх наявність у своїх документах:

$ fgrep  –f  common-errors document

Команда egrep обробляє ті ж регулярні вирази, що і grep (див табл 41), але з кількома доповненнями Дужки дозволяють групувати вираження, так що (xy) * визначає порожній рядок, xy, xyxy, xyxyxy і т д Оператор або записується як вертикальна риса

| вираз today | tomorrow означає today або tomorrow – так само, як і вираз to (day | morrow) І нарешті, в egrep є два додаткові оператора замикання, + і. Шаблон x + визначає один або більше символів x, а x – Нуль або один символ, але не більше

Програма egrep добре підходить для пошуку слів із заданими свойст вами в словнику Ми працюємо зі словником Websters Second International, який зберігається в системі у вигляді списку слів, по одному на рядок, без словникових статей Ви можете використовувати словник / usr / dict / words Він не такий великий і призначений для перевірки орфографії перевірте, в якому форматі зберігаються в ньому слова Наведемо шаблон для пошуку слів, що містять всі голосні в алфавітному порядку:

$ cat  alphvowels

^[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*$

$ egrep  –f  alphvowels  /usr/dict/web2 | 3

abstemious

abstemiously

abstentious

achelious

acheirous

acleistous

affectious

annelidous

arsenious

arterious

bacterious

caesious

facetious

facetiously

fracedinous

majestious

$

Шаблон у файлі alphvowels не полягає в лапки Якщо шаблон egrep знаходиться в лапках, то оболонка НЕ ​​інтерпретує його сама, а лише прибирає лапки, тому egrep ніколи їх не бачить Але так як файл оболонкою не обробляється, то і лапки в ньому НЕ потрібні

У наведеному вище прикладі можна було використовувати команду grep, але egrep виконує пошук по шаблонах з замиканнями набагато швидше, особливо у великих файлах

Ось ще один приклад – пошук слів, що складаються з шести і більше букв, розташованих в алфавітному порядку:

$ cat  monotonic

^abcdefghijklmnopqrstuvwxyz$

$ egrep  –f  monotonic  /usr/dict/web2  | grep  ’…..’  |  5

abdest

acknow

adipsy

agnosy

almost

befist

behint

beknow

bijoux

biopsy

chintz

dehors

dehort

deinos

dimpsy

egilops

ghosty

$

(Egilops – це хвороба пшениці) 1 Зверніть увагу на використання grep для фільтрації виведення egrep

Навіщо потрібні три програми grep Справа в тому, що fgrep, хоч і не вміє обробляти метасимволи, зате ефективно виконує пошук декількох тисяч слів одночасно (після ініціалізації час виконання не залежить від кількості слів), і внаслідок цього застосовується головним чином в таких завданнях, як бібліографічний пошук Зазвичай розмір шаблону fgrep набагато перевершує можливості алго ритмів, реалізованих в grep і egrep Складніше пояснити різницю між grep і egrep Програма grep зявилася набагато раніше за інших, вона підтримує синтаксис регулярних виразів, знайомий по редактору ed, обробляє регулярні вирази з тегами і має великий набір параметрів Програма egrep обробляє більше різних виразів (за винятком тегів) і виконується набагато швидше (причому швидкість не залежить від виду шаблону), але стан дротяні версія довше стартує на складних виразах Існує більше нова версія, яка стартує швидше, так що egrep і grep можуть бути обєднані в одну програму пошуку за шаблоном

Вправа 41Вивчіть регулярні вирази з тегами (\ (і \)) у додатку 1 або в ed (1) і використовуйте grep для пошуку паліндромів – слів, які пишуться однаково в обох напрямках Підказка: задайте окремі шаблони для кожної довжини слова ~

Вправа 42 Схема роботи grep полягає в читанні одного рядка, перевірці збігів і повторенні циклу Як може відбитися на grep можливість завдання в шаблоні символу нового рядка ~

1 Важко зрозуміти, чому автори визнали доречним пояснити значення саме цього слова Розширимо коментар: abdest – (у мусульман) ритуал обмивання рук перед молитвою dehors – зовні, за межами (To) dehort – відмовляти, переконувати dimpsy – тьмяний, сутінковий – Прямуючи ред

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*