Egrep регулярні вирази. Регулярні вирази та команда grep. Реалізації утиліти rename

Головна / Захист

Щоб повноцінно обробляти тексти в bash-скриптах за допомогою sed і awk, просто необхідно розібратися з регулярними виразами. Реалізації цього корисного інструменту можна знайти буквально всюди, і хоча влаштовані всі регулярні вислови подібним чином, засновані на тих самих ідеях, у різних середовищах робота з ними має певні особливості. Тут ми поговоримо про регулярні висловлювання, які підходять для використання у сценаріях командного рядка Linux.

Цей матеріал задуманий як введення в регулярні висловлювання, розраховане на тих, хто може зовсім не знати, що це таке. Тому почнемо із самого початку.

Що таке регулярні вирази

У багатьох, коли вони вперше бачать регулярні висловлювання, відразу виникає думка, що перед ними безглузде нагромадження символів. Але це, звісно, ​​далеко не так. Погляньте, наприклад, на цей регулярний вираз

На наш погляд навіть абсолютний новачок відразу зрозуміє, як воно влаштоване і навіщо потрібно :) Якщо ж вам не зовсім зрозуміло - просто читайте далі і все стане на свої місця.
Регулярний вираз - це шаблон, користуючись яким програми на зразок sed або awk фільтрують тексти. У шаблонах використовуються звичайні ASCII-символи, що представляють себе, і звані метасимволи, які грають особливу роль, наприклад, дозволяючи посилатися деякі групи символів.

Типи регулярних виразів

Реалізації регулярних виразів у різних середовищах, наприклад, у мовах програмування на кшталт Java, Perl та Python, в інструментах Linux на кшталт sed, awk та grep, мають певні особливості. Ці особливості залежать від про двигунів обробки регулярних виразів, які займаються інтерпретацією шаблонів.
У Linux є два движки регулярних виразів:

  • Двигун, що підтримує POSIX Basic Regular Expression (BRE).
  • Двигун, який підтримує стандарт POSIX Extended Regular Expression (ERE).

Більшість утиліт Linux відповідають, як мінімум, стандарту POSIX BRE, але деякі утиліти (у тому числі sed) розуміють лише деяке підмножина стандарту BRE. Одна з причин такого обмеження - прагнення зробити такі утиліти якнайшвидше у справі обробки текстів.

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

Існує багато способів розробки регулярних виразів, що залежать і від думки програміста, і від особливостей движка, під який їх виробляють. Непросто писати універсальні регулярні вирази, які зможе зрозуміти будь-який двигун. Тому ми зосередимося на регулярних виразах, що найчастіше використовуються, і розглянемо особливості їх реалізації для sed і awk.

Регулярні вирази POSIX BRE

Мабуть, найпростіший шаблон BRE є регулярним виразом для пошуку точного входження послідовності символів у тексті. Ось як виглядає пошук рядка в sed та awk:

$ echo "Цей тест" | sed -n "/test/p" $ echo "Цей тест" | awk "/test/(print $0)"

Пошук тексту за шаблоном у sed

Пошук тексту за шаблоном в awk

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

Працюючи з регулярними виразами, потрібно враховувати те, що вони чутливі до регістру символів:

$ echo "Цей тест" | awk "/Test/(print $0)" $ echo "This is a test" | awk "/test/(print $0)"

Регулярні вирази чутливі до регістру

Перше регулярне вираз збігів не знайшло, оскільки слово «test», що починається з великої літери, в тексті не зустрічається. Друге ж, налаштоване на пошук слова, написаного великими літерами, виявило в потоці відповідний рядок.

У регулярних виразах можна використовувати не лише літери, а й прогалини, і цифри:

$ echo "Тим є 2 тести" | awk "/test 2/(print $0)"

Пошук фрагмента тексту, що містить пробіли та цифри

Прогалини сприймаються двигуном регулярних виразів як стандартні знаки.

Спеціальні символи

При використанні різних символів у регулярних виразах треба враховувати деякі особливості. Так, існують деякі спеціальні символи або метасимволи, використання яких у шаблоні вимагає особливого підходу. Ось вони:

.*^${}+?|()

Якщо один із них потрібен у шаблоні, його потрібно буде екранувати за допомогою зворотної косої межі (зворотного слеша) - .

Наприклад, якщо в тексті потрібно знайти знак долара, його треба включити до шаблону, попередивши символ екранування. Скажімо, є файл myfile з таким текстом:

There is 10$ on my pocket

Знак долара можна знайти за допомогою такого шаблону:

$ awk "/$/(print $0)" myfile

Використання у шаблоні спеціального символу

Крім того, зворотна коса риса - це теж спеціальний символ, тому якщо потрібно використовувати його в шаблоні, його теж треба буде екранувати. Виглядає це як два слеші, що йдуть один за одним:

$ echo "is a special character" | awk "/\/(print $0)"

Екранування зворотного слешу

Хоча прямий слеш і не входить до списку спеціальних символів, спроба скористатися ним у регулярному виразі, написаному для sed або awk, приведе до помилки:

Неправильне використання прямого слеша у шаблоні

Якщо він потрібний, його теж треба екранувати:

$ echo "3/2" | awk "///(print $0)"

Екранування прямого слешу

Якірні символи

Існують два спеціальні символи для прив'язки шаблону до початку або до кінця текстового рядка. Символ «кришка» - дозволяє описувати послідовності символів, які знаходяться на початку текстових рядків. Якщо шаблон виявиться в іншому місці рядка, регулярний вираз на нього не відреагує. Виглядає використання цього символу так:

$ echo "welcome to likegeeks website" | awk "/^likegeeks/(print $0)" $ echo "likegeeks website" | awk "/^likegeeks/(print $0)"

Пошук шаблону на початку рядка

Символ ^ призначений для пошуку шаблону на початку рядка, при цьому регістр символів також враховується. Подивимося, як це вплине на обробку текстового файлу:

$ awk "/^this/(print $0)" myfile


Пошук шаблону на початку рядка у тексті з файлу

При використанні sed, якщо помістити кришку десь усередині шаблону, вона сприйматиметься як будь-який інший звичайний символ:

$ echo "This ^ is a test" | sed -n "/s ^/p"

Кришка, що знаходиться не на початку шаблону в sed

В awk, при використанні такого ж шаблону, цей символ потрібно екранувати:

$ echo "This ^ is a test" | awk "/s ^/(print $0)"

Кришка, що знаходиться не на початку шаблону в awk

З пошуком фрагментів тексту, що знаходяться на початку рядка, ми розібралися. Що, якщо потрібно знайти щось, розташоване в кінці рядка?

У цьому нам допоможе знак долара - $, який є якорним символом кінця рядка:

$ echo "Цей тест" | awk "/test$/(print $0)"

Пошук тексту, що знаходиться в кінці рядка

В одному і тому ж шаблоні можна використовувати обидва якірні символи. Виконаємо обробку файлу myfile , вміст якого показано на малюнку нижче, за допомогою такого регулярного виразу:

$ awk "/^this is a test$/(print $0)" myfile


Шаблон, в якому використані спеціальні символи початку та кінця рядка

Як видно, шаблон зреагував лише на рядок, що повністю відповідає заданій послідовності символів та їх розташування.

Ось як, користуючись якірними символами, відфільтрувати порожні рядки:

$ awk "!/^$/(print $0)" myfile

У даному шаблоні використовував символ заперечення, знак оклику - ! . Завдяки використанню такого шаблону виконується пошук рядків, що не містять нічого між початком і кінцем рядка, а завдяки знаку оклику на друк виводяться лише рядки, які не відповідають цьому шаблону.

Символ «точка»

Точка використовується для пошуку будь-якого одиночного символу, крім символу перекладу рядка. Передамо такому регулярному виразу файл myfile, вміст якого наведено нижче:

$ awk "/.st/(print $0)" myfile


Використання точки в регулярних виразах

Як видно за виведеними даними, шаблону відповідають лише перші два рядки з файлу, так як вони містять послідовність символів «st», попереджену ще одним символом, у той час як третій рядок відповідної послідовності не містить, а в четвертому він є, але знаходиться в на самому початку рядка.

Класи символів

Крапка відповідає будь-якому одиночному символу, але що якщо потрібно гнучкіше обмежити набір символів, що шукаються? У цій ситуації можна скористатися класами символів.

Завдяки такому підходу можна організувати пошук будь-якого символу із заданого набору. Для опису класу символів використовуються квадратні дужки - :

$ awk "/th/(print $0)" myfile


Опис класу символів у регулярному виразі

Тут ми шукаємо послідовність символів th, перед якою є символ o або символ i.

Класи виявляються дуже доречними, якщо виконується пошук слів, які можуть починатися як з великої, так і з малої літери:

$ echo "це є" | awk "/his is a test/(print $0)" $ echo "This is a test" | awk "/his is a test/(print $0)"

Пошук слів, які можуть починатися з малої або великої літери

Класи символів не обмежені літерами. Тут можна використовувати інші символи. Не можна заздалегідь сказати, в якій ситуації знадобляться класи - все залежить від завдання, що вирішується.

Заперечення класів символів

Класи символів можна використовувати і для вирішення задачі, що описана вище. А саме замість пошуку символів, що входять до класу, можна організувати пошук всього, що в клас не входить. Щоб домогтися такої поведінки регулярного висловлювання, перед списком символів класу потрібно помістити знак ^ . Виглядає це так:

$ awk "/[^oi]th/(print $0)" myfile


Пошук символів, які не входять до класу

У цьому випадку будуть знайдені послідовності символів th, перед якими немає ні o, ні i.

Діапазони символів

У символьних класах можна описувати діапазони символів, використовуючи тире:

$ awk "/st/(print $0)" myfile


Опис діапазону символів у класі класу

У цьому прикладі регулярне вираження реагує на послідовність символів "st", перед якою знаходиться будь-який символ, розташований, в алфавітному порядку, між символами "e" і "p".

Діапазони можна створювати і з чисел:

$ echo "123" | awk "//" $ echo "12a" | awk "//"

Регулярний вираз для пошуку трьох будь-яких чисел

До класу символів можуть входити кілька діапазонів:

$ awk "/st/(print $0)" myfile


Клас символів, що складається з кількох діапазонів

Дане регулярне вираз знайде всі послідовності "st", перед якими є символи з діапазонів a-f і m-z.

Спеціальні класи символів

BRE має спеціальні класи символів, які можна використовувати при написанні регулярних виразів:

  • [[:alpha:]] - відповідає будь-якому алфавітному символу, записаному у верхньому або нижньому регістрі.
  • [[:alnum:]] - відповідає будь-якому алфавітно-цифровому символу, а саме - символам в діапазонах 0-9, A-Z, a-z.
  • [[:blank:]] - відповідає пробілу та знаку табуляції.
  • [[:digit:]] - будь-який цифровий символ від 0 до 9 .
  • [[:upper:]] - символи алфавіту у верхньому регістрі - A-Z .
  • [[:lower:]] - алфавітні символи в нижньому регістрі - a-z.
  • [[:print:]] - відповідає будь-якому символу, що друкується.
  • [[:punct:]] - відповідає розділовим знакам.
  • [[:space:]] - пробілові символи, зокрема - пробіл, знак табуляції, символи NL, FF, VT, CR.

Використовувати спеціальні класи у шаблонах можна так:

$ echo "abc" | awk "/[[:alpha:]]/(print $0)" $ echo "abc" | awk "/[[:digit:]]/(print $0)" $ echo "abc123" | awk "/[[:digit:]]/(print $0)"


Спеціальні класи символів у регулярних виразах

Символ «зірочка»

Якщо в шаблоні після символу помістити зірку, це означатиме, що регулярний вираз спрацює, якщо символ з'являється в рядку будь-яку кількість разів, включаючи ситуацію, коли символ у рядку відсутній.

$ echo " Test " | awk "/tes*t/(print $0)" $ echo "tessst" | awk "/tes*t/(print $0)"


Використання символу * у регулярних виразах

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

$ echo "I like green color" | awk "/colou*r/(print $0)" $ echo "I like green colour " | awk "/colou*r/(print $0)"

Пошук слова, що має різні варіанти написання

У цьому прикладі те саме регулярне вираження реагує і слово «color», і слово «colour». Це так завдяки тому, що символ «u», після якого стоїть зірочка, може бути відсутнім, або зустрічатися кілька разів поспіль.

Ще одна корисна можливість, що з особливостей символу зірочки, полягає у комбінуванні його з точкою. Така комбінація дозволяє регулярно висловлювати реагування на будь-яку кількість будь-яких символів:

$ awk "/this.*test/(print $0)" myfile


Шаблон, що реагує на будь-яку кількість символів

В даному випадку неважливо скільки та яких символів знаходиться між словами "this" і "test".

Зірочка можна використовувати і з класами символів:

$ echo "st" | awk "/s*t/(print $0)" $ echo "sat" | awk "/s*t/(print $0)" $ echo "set" | awk "/s*t/(print $0)"


Використання зірочки з класами символів

У всіх трьох прикладах регулярний вираз спрацьовує, оскільки зірочка після класу символів означає, що якщо буде знайдено будь-яку кількість символів «a» або «e», а також якщо їх знайти не вдасться, рядок буде відповідати заданому шаблону.

Регулярні вирази POSIX ERE

Шаблони POSIX ERE, які підтримують деякі утиліти Linux, можуть містити додаткові символи. Як уже було сказано, awk підтримує цей стандарт, а ось sed – ні.

Тут ми розглянемо символи, що найчастіше використовуються в ERE-шаблонах, які стануть вам у нагоді при створенні власних регулярних виразів.

▍Запитальний знак

Знак питання вказує на те, що попередній символ може зустрітися в тексті один раз або не зустрітися зовсім. Цей символ - один із метасимволів повторень. Ось кілька прикладів:

$ echo "tet" | awk "/tes?t/(print $0)" $ echo "test" | awk "/tes?t/(print $0)" $ echo "tesst" | awk "/tes?t/(print $0)"


Знак питання в регулярних виразах

Як видно, у третьому випадку літера "s" зустрічається двічі, тому на слово "tesst" регулярне вираження не реагує.

Знак питання можна використовувати і з класами символів:

$ echo "tst" | awk "/t?st/(print $0)" $ echo "test" | awk "/t?st/(print $0)" $ echo "tast" | awk "/t?st/(print $0)" $ echo "taest" | awk "/t?st/(print $0)" $ echo "teest" | awk "/t?st/(print $0)"


Знак питання та класи символів

Якщо символів з класу в рядку немає, або один із них зустрічається один раз, регулярний вираз спрацьовує, проте варто у слові з'явитися двом символам і система вже не знаходить у тексті відповідності шаблону.

▍Символ «плюс»

Символ «плюс» у шаблоні вказує на те, що регулярне вираз виявить шукане в тому випадку, якщо попередній символ зустрінеться в тексті один або більше разів. При цьому на відсутність символу така конструкція не реагуватиме:

$ echo " Test " | awk "/te+st/(print $0)" $ echo "teest" | awk "/te+st/(print $0)" $ echo "tst" | awk "/te+st/(print $0)"


Символ «плюс» у регулярних виразах

У цьому прикладі, якщо символу «e» у слові немає, двигун регулярних виразів не знайде у тексті відповідностей шаблону. Символ «плюс» працює і з класами символів - цим він схожий на зірку і знак питання:

$ echo "tst" | awk "/t+st/(print $0)" $ echo "test" | awk "/t+st/(print $0)" $ echo "teast" | awk "/t+st/(print $0)" $ echo "teeast" | awk "/t+st/(print $0)"


Знак «плюс» та класи символів

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

▍Фігурні дужки

Фігурні дужки, якими можна користуватися в ERE-шаблонах, схожі на символи, розглянуті вище, але дозволяють точніше задавати необхідну кількість входжень попереднього символу. Вказувати обмеження можна у двох форматах:

  • n - число, що задає точну кількість шуканих входжень
  • n, m - два числа, які трактуються так: "як мінімум n разів, але не більше ніж m".

Ось приклади першого варіанта:

$ echo "tst" | awk "/te(1)st/(print $0)" $ echo "test" | awk "/te(1)st/(print $0)"

Фігурні дужки у шаблонах, пошук точного числа входжень

У старих версіях awk потрібно було використовувати ключ командного рядка --re-interval для того, щоб програма розпізнавала інтервали в регулярних виразах, але в нових версіях цього не потрібно.

$ echo "tst" | awk "/te(1,2)st/(print $0)" $ echo "test" | awk "/te(1,2)st/(print $0)" $ echo "teest" | awk "/te(1,2)st/(print $0)" $ echo "teeest" | awk "/te(1,2)st/(print $0)"


Інтервал, заданий у фігурних дужках

У цьому прикладі символ «e» повинен зустрітися у рядку 1 або 2 рази, тоді регулярне вираз відреагує на текст.

Фігурні дужки можна використовувати і з класами знаків. Тут діють вже знайомі вам принципи:

$ echo "tst" | awk "/t(1,2)st/(print $0)" $ echo "test" | awk "/t(1,2)st/(print $0)" $ echo "teest" | awk "/t(1,2)st/(print $0)" $ echo "teeast" | awk "/t(1,2)st/(print $0)"


Фігурні дужки та класи символів

Шаблон відреагує на текст у тому випадку, якщо в ньому один чи два рази зустрінеться символ a або символ e.

▍Символ логічного «або»

Символ | - Вертикальна риса, означає в регулярних виразах логічне «або». Обробляючи регулярне вираз, що містить кілька фрагментів, розділених таким знаком, двигун вважатиме аналізований текст відповідним у тому випадку, якщо він відповідатиме кожному з фрагментів. Ось приклад:

$ echo "Цей тест" | awk "/test|exam/(print $0)" $ echo "Тим є exam" | awk "/test|exam/(print $0)" $ echo "Тим є небагато" | awk "/test|exam/(print $0)"


Логічне «або» у регулярних виразах

У цьому прикладі регулярний вираз налаштований на пошук у тексті слів "test" або "exam". Зверніть увагу на те, що між фрагментами шаблону і символом, що розділяє їх | не повинно бути прогалин.

Фрагменти регулярних виразів можна групувати, користуючись круглими дужками. Якщо згрупувати певну послідовність символів, вона сприйматиметься системою як звичайний символ. Тобто, наприклад, до неї можна буде застосувати метасимволи повторень. Ось як це виглядає:

$ echo "Like" | awk "/Like(Geeks)?/(print $0)" $ echo "LikeGeeks" | awk "/Like(Geeks)?/(print $0)"


Угруповання фрагментів регулярних виразів

У цих прикладах слово "Geeks" укладено в круглі дужки, після цієї конструкції йде знак питання. Нагадаємо, що знак питання означає «0 або 1 повторення», в результаті регулярне вираз відреагує і на рядок «Like», і на рядок «LikeGeeks».

Практичні приклади

Після того, як ми розібрали основи регулярних виразів, настав час зробити з їх допомогою щось корисне.

▍Підрахунок кількості файлів

Напишемо bash-скрипт, який підраховує файли, що знаходяться в директоріях, які записані в змінну оточення PATH. Для того, щоб це зробити, знадобиться для початку сформувати список шляхів до директорій. Зробимо це за допомогою sed, замінивши двокрапки на прогалини:

$ echo $ PATH | sed "s/:/ /g"

Команда заміни підтримує регулярні вирази як шаблони для пошуку тексту. В даному випадку все дуже просто, шукаємо ми символ двокрапки, але ніхто не заважає використовувати тут і щось інше - все залежить від конкретного завдання.
Тепер треба пройтись по отриманому списку в циклі і виконати необхідні для підрахунку кількості файлів дії. Загальна схема скрипту буде такою:

Mypath=$(echo $PATH | sed "s/:/ /g") для директорів у $mypath do done

Тепер напишемо повний текст скрипту, скориставшись командою ls для отримання відомостей про кількість файлів у кожній із директорій:

#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") count=0 для директорії в $mypath для check=$(ls $directory) для пункту в $check do count=$ [ $count + 1 ] done echo "$directory - $count" count=0 done

При запуску скрипта може виявитися, що деяких директорій з PATH не існує, проте це не завадить йому порахувати файли в існуючих директоріях.


Підрахунок файлів

Головна цінність цього прикладу полягає в тому, що користуючись тим самим підходом, можна вирішувати і куди складніші завдання. Які саме – залежить від ваших потреб.

▍Перевірка адрес електронної пошти

Існують веб-сайти з величезними колекціями регулярних виразів, які дозволяють перевіряти адреси електронної пошти, номери телефонів, і так далі. Однак, одна справа – взяти готове, і зовсім інша – створити щось самому. Тому напишемо регулярний вираз для перевірки адрес електронної пошти. Почнемо з аналізу вихідних даних. Ось, наприклад, якась адреса:

[email protected]

Ім'я користувача, username, може складатися з алфавітно-цифрових та деяких інших символів. Зокрема, це точка, тире, знак підкреслення, знак «плюс». За іменем користувача слідує знак @.

Озброївшись цими знаннями, почнемо складання регулярного виразу з його лівої частини, яка служить для перевірки імені користувача. Ось що в нас вийшло:

^(+)@

Тепер - черга імені хоста - hostname. Тут застосовні самі правила, що й імені користувача, тому шаблон йому виглядатиме так:

(+)

Ім'я домену верхнього рівня підпорядковується спеціальним правилам. Тут можуть бути лише алфавітні символи, яких має бути не менше двох (наприклад, такі домени зазвичай містять код країни) і не більше п'яти. Все це означає, що шаблон для перевірки останньої частини адреси буде таким:

.({2,5})$

Прочитати його можна так: «Спочатку має бути точка, потім – від 2 до 5 алфавітних символів, а після цього рядок закінчується».

Підготувавши шаблони для окремих частин регулярного вираження, зберемо їх разом:

^(+)@(+).({2,5})$

Тепер залишилося лише протестувати те, що вийшло:

$ echo " [email protected]" | awk "/^(+)@(+).((2,5))$/(print $0)" $ echo " [email protected]" | awk "/^(+)@(+).((2,5))$/(print $0)"


Перевірка адреси електронної пошти за допомогою регулярних виразів

Те, що переданий текст awk виводиться на екран, означає, що система розпізнала в ньому адресу електронної пошти.

Підсумки

Якщо регулярний вираз для перевірки адрес електронної пошти, який зустрівся вам на початку статті, здавався тоді зовсім незрозумілим, сподіваємося, зараз він уже не виглядає безглуздим набором символів. Якщо це дійсно так – значить цей матеріал виконав своє призначення. Насправді, регулярні висловлювання – це тема, якою можна займатися все життя, але навіть те небагато, що ми розібрали, вже здатне допомогти вам у написанні скриптів, які доволі просунуто обробляють тексти.

У цій серії матеріалів ми показували дуже прості приклади bash-скриптів, які складалися буквально з декількох рядків. Наступного разу розглянемо дещо масштабніше.

Шановні читачі! А ви користуєтеся регулярними виразами при обробці текстів у сценаріях командного рядка?

grep розшифровується як 'global regular expression printer'. grep відрізає потрібні вам рядки з текстових файлів, які містять вказаний користувачем текст.

grep може бути використаний двома шляхами - сам собою або в комбінації з потоками.

grep дуже великий у функціональності, за рахунок великої кількості підтримуваних ним опцій, таких як: пошук з використанням рядкового шаблону або RegExp регулярних виразів шаблону або perl based регулярних виразів і т.д.

Через його різні функціональні можливості інструмент grep має безліч варіантів, включаючи egrep (Extended GREP), fgrep (Fixed GREP), pgrep (Process GREP), rgrep (рекурсивний GREP)і т.д. Але ці варіанти мають незначні відмінності від оригінального grep.

Параметри grep

$ grep -V grep (GNU grep) 2.10 Copyright (C) 2011 Free Software Foundation, Inc. Ліцензія GPLv3+

Існують модифікації утиліти grep: egrep (з обробкою розширених регулярних виразів), fgrep (трактує символи $*^|()\ як літерали, тобто буквально), rgrep (з включеним рекурсивним пошуком).

    egrep те саме що grep -E

    fgrep те саме що grep -F

    rgrep те саме що grep -r

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] обмежений_регулярний_вираз_BRE [файл …]

Команда grep зіставляє рядки вихідних файлів із шаблоном, заданим обмеженим_регулярним_виразом. Якщо файли не вказані, використовується стандартне введення. Зазвичай, кожен успішно зіставлений рядок копіюється на стандартний висновок; якщо вихідних файлів кілька, перед знайденим рядком видається ім'я файлу. У grep використовується компактний недетермінований алгоритм. Як шаблони сприймаються обмежені регулярні вирази (вирази, що мають своїми значеннями ланцюжки символів, і використовують обмежений набір алфавітно-цифрових і спеціальних символів). Вони мають той самий сенс, що й регулярні вирази у ed.

Для екранування символів $, *, , ^, |, (), і від інтерпретації shell"ом найпростіше укладати обмежене_регулярне_вираження в одинарні лапки.

Опції:

B Попереджає кожний рядок номером блоку, в якому його було знайдено. Це може стати в нагоді при пошуку блоків за контекстом (блоки нумеруються з 0). -c Видає лише кількість рядків, що містять зразок. -h Запобігає видачу імені файлу, що містить рядок, що зіставився, перед власне рядком. Використовується при пошуку кількох файлів. -i Ігнорує регістр символів під час порівняння. -l Видає тільки імена файлів, що містять рядки, що зіставилися, по одному в рядку. Якщо зразок знайдено у кількох рядках файлу, ім'я файлу не повторюється. -n Видає перед кожним рядком номер у файлі (рядки нумеруються з 1). -s Пригнічує видачу повідомлень про не існуючі або недоступні для читання файли. -v Видає всі рядки, за винятком зразків. -w Шукає вираз як слово, ніби воно було оточене метасимволами \< и \>.

grep --help

Використання: grep [ПАРАМЕТР]… ШАБЛОН [ФАЙЛ]… Пошук ШАБЛОНУ в кожному ФАЙЛІ або стандартному введенні. За умовчанням, ШАБЛОН є простим регулярним виразом (BRE). Приклад: grep -i "hello world" menu.h main.c Вибір типу регулярного виразу та його інтерпретація: -E, --extended-regexp ШАБЛОН - розширений регулярний вираз (ERE) -F, --fixed-regexp ШАБЛОН - рядки фіксованої довжини, розділені символом нового рядка -G, --basic-regexp ШАБЛОН - простий регулярний вираз (BRE) -P, --perl-regexp ШАБЛОН - регулярний вираз мови Perl -e, --regexp=ШАБЛОН використовувати ШАБЛОН для пошуку - f, --file=ФАЙЛ брати ШАБЛОН з ФАЙЛу -i, --ignore-case ігнорувати відмінність регістру -w, --word-regexp ШАБЛОН повинен підходити до всіх слів -x, --line-regexp ШАБЛОН повинен підходити до всього рядка -z, --null-data рядки поділяються байтом з нульовим значенням, а не символом кінця рядка. -version надрукувати інформацію про версію та вийти --help показати цю довідку та закінчити роботу --mmap для зворотної сумісності, ігнорується Управління висновком: -m, --max-count=КІСЛО зупинитися після вказаного ЧИСЛА збігів -b, --byte- offset друкувати разом з вихідними рядками усунення в байтах -n, --line-number друкувати номер рядка разом з вихідними рядками --line-buffered скидати буфер після кожного рядка -H, --with-filename друкувати ім'я файлу для кожного збігу -h , --no-filename не починати виведення з імені файлу --label=МІТКА використовувати МІТКУ як ім'я файлу для стандартного введення -o, --only-matching показувати тільки частину рядка, що збігається з ШАБЛОНОМ -q, --quiet, - -silent придушувати весь звичайний висновок --binary-files=ТІП вважати, що двійковий файл має тип: binary, text або without-match. -a, --text те саме що і --binary-files=text -I те саме, що і --binary-files=without-match -d, --directories=ДІЙ як обробляти каталоги ДІЯ може бути read (читати ), recurse (рекурсивно) чи skip (пропускати). -D, --devices=ДІЙ як обробляти пристрої, FIFO та сокети ДІЯ може бути read або skip -R, -r, --recursive те ж, що і --directories=recurse --include=Ф_ШАБЛОН обробити тільки файли, що підпадають під Ф_ШАБЛОН --exclude=Ф_ШАБЛОН пропустити файли та каталоги, що підпадають під Ф_ШАБЛОН --exclude-from=ФАЙЛ пропустити файли, що підпадають під шаблон файлів із ФАЙЛА --exclude-dir=ШАБЛОН каталоги, що підпадають під ШАБЛОН, будуть пропущені -L, - -files-without-match друкувати тільки імена ФАЙЛІВ без збігів -l, --files-with-matches друкувати тільки імена ФАЙЛІВ з збігами -c, --count друкувати тільки кількість рядків, що збігаються на ФАЙЛ -T, --initial-tab вирівнювати табуляцією (якщо потрібно) -Z, --null друкувати байт 0 після імені ФАЙЛА Управління контекстом: -B, --before-context=ЧІС друкувати ЧИСЛО рядків попереднього контексту -A, --after-context=ЧИС друкувати ЧИСЛО рядків наступного контексту -C, --context[=ЧИС] друкувати ЧИСЛО рядків контексту -ЧИСЛО те ж, що і --context=КІЛЬКІСТЬ --color[=КОЛИ], --colour[=КОЛИ] використовувати маркери для відмінності збігаються рядків; КОЛИ може бути always (завжди), never (ніколи) або auto (автоматично) -U, --binary не видаляти символи CR в кінці рядка (MSDOS) -u, --unix-byte-offsets видавати зміщення, начебто ні CR-ів (MSDOS) Замість «egrep» передбачається запуск «grep-E». Замість "fgrep" передбачається "grep-F". Запуск під іменами "egrep" або "fgrep" краще не виконувати. Коли не заданий ФАЙЛ, або коли ФАЙЛ це - то читається стандартне введення. Якщо вказано менше, ніж два файли, передбачає -h. При знаходженні збігів кодом завершення програми буде 0 і 1, якщо ні. При виникненні помилок, або якщо не вказано параметр -q, кодом завершення буде 2. Про помилки повідомляйте за адресою Про помилки у перекладі повідомляйте за адресою Домашня сторінка GNU Grep: Довідка щодо роботи з програмами GNU:

Регулярні вирази Bash командної оболонки призначені для одного з основних інструментів, що дозволяють взаємодіяти між користувачем та операційною системою. Через оболонку користувач може керувати файлами та каталогами, присутніми у файловій системі машини, обробляти їх вміст і виконувати інші програми, використовуючи клавіатуру свого терміналу як блок введення і буквено-цифровий екран терміналу як вихідний пристрій.

Регулярні вирази Bash розроблені Браяном Фоксом для проекту GNU як альтернативна зміна програмного забезпечення для оболонки Bourne. Командна мова була видана в 1989 році і масово поширилася як оболонка входу за замовчуванням для дистрибутивів Linux і MacOS через Apple (передусім OS X). Версія також доступна для Windows 10 і є стандартною оболонкою користувача в Solaris 11.

Bash - це інструктивний процесор, який традиційно працює в текстовому терміналі, де розробник запускає команди, що викликають дії. Регулярні вирази Bash читаються та виконуються з файлу, що називається сценарієм оболонки. Разом з Unix він розпізнає імена файлів (порівняння підстановочних символів), протоколи, документи, підстановку директив та структури керування для тестування критеріїв. У головних словах синтаксис та інші ключові особливості мови відтворюються з csh і ksh. Bash - це POSIX-сумісна оболонка, але з деякими розширеннями. Назва оболонки - це скорочення від

Браян Фокс почав кодувати "Баша" 10 січня 1988 після того, як Річард Столлман був незадоволений відсутністю прогресу в розробках безкоштовної оболонки, яка могла б запускати існуючі сценарії. Фокс випустив Bash як бета-версію 8 червня 1989 і залишався основним розробником проекту з середини 1992 року і до середини 1994 року, після чого він був звільнений з ФСФ, а його місце зайняв Чет Рамі.

У цей період Bash була найпопулярнішою програмою серед користувачів Linux, ставши інтерактивною оболонкою за умовчанням у різних дистрибутивах цієї операційної системи, а також MacOS від Apple. Bash також була вкраплена в Microsoft Win з Cygwin, в DOS за проектом DJGPP і Android за допомогою різних додатків емуляції терміналу.

На початку вересня 2014 року було виявлено пристойний пролом безпеки в "Баші" версії 1.03, що вийшла в серпні 1989 року, що отримала назву Shellshock, яка призвела до цілої низки атак через Інтернет. Помилка вважалася серйозною, оскільки з використанням Bash стали вразливими, що дало змогу виконувати довільний код. Патчі для виправлення помилок стали доступними відразу після їх виявлення, але не всі комп'ютери були оновлені.

Особливості синтаксису оболонки

Bash є надбагатьма командами оболонки Bourne і використовує розширення брекетів, завершення командного рядка, базове налагодження та обробку винятків із застосуванням пастки серед інших функцій. Виконує переважну більшість сценаріїв оболонки Bourne без змін, крім сценаріїв, які по-різному інтерпретуються чи намагаються запустити системну команду. Регулярні вирази Bash grep, а також інструменти GNU використовують стислий спосіб сканування помилок і встановлюють статус виходу, що дозволяє потокам переходити до традиційних пунктів призначення.

Якщо розробник натискає кнопку табуляції в командній оболонці, Bash автоматично застосовує закінчення командного рядка, щоб підходити до типізованих імен програм, файлів та змінних. Система припинення командного рядка нескінченно гнучка та керована, і її нерідко складають із функціями, що зберігають аргументи та імена файлів для конкретних програм та завдань. Синтаксис Bash має достатню кількість розширень, відсутні в оболонці Bourne.

Регулярні вирази Bash: виконання цілісних розрахунків арифметичної оцінки, використовується ((...)) команда і $ ((...)) аргумент синтаксису, що спрощує переадресовування введення-виведення. Наприклад, він має можливість перенаправляти висновок (stdout) і збій (stderr) синхронно з підтримкою оператора. Це легше ввести, ніж еквівалент оболонки Bourne " command > file 2>&1".

Bash використовує заміщення процесу з підтримкою синтаксису регулярних виразів "Лінукс" і підміняє виведення команди (введення), що традиційно застосовує ім'я файлу. При використанні ключового слова "функція", оголошення Bash несумісні зі сценаріями Bourne і Korn, так як оболонка Korn має ту ж проблему при застосуванні "функції", але вона приймає той же синтаксис оголошення функції, що і вищезгадані оболонки, будучи POSIX-сумісною.

Через ці та інші відмінності сценарії рідко виконуються під інтерпретаторами Bourne і Korn, якщо вони не були спеціально написані з урахуванням цієї сумісності, що потрібно враховувати при плануванні роботи з регулярними виразами Bash. Асоціативні масиви дозволяють підроблену підтримку індексованих масивів, аналогічно AWK. Bash 4.x не був інтегрований у нову версію MacOS через обмеження ліцензії. Приклад асоціативного масиву.

Оболонка має два режими виконання команд: пакетний та паралельний. Команди в пакетному режимі розділені символом ";". Регулярні вирази Bash, приклад:

  • command1;
  • command2.

У цьому прикладі, коли команда 1 завершена, виконується команда 2. І так само можна виконати виконання фонового команди 1 за допомогою (symbol &) в кінці виконання, процес буде виконуватися у фоновому режимі, повертаючи відразу управління оболонці і дозволяючи користувачеві застосовувати команди, що виконуються.

Для одночасного виконання команд 1 та 2 вони повинні бути виконані в оболонці наступним чином:

  • command1 і command2.

У цьому випадку команда 1 виконується у фоновому режимі & symbol, відразу повертаючи управління оболонці, яка виконує команду 2 на передньому плані. Регулярні вирази Bash grep можна зупинити та повернути керування, набравши Ctrl+z, поки процес виконується на передньому плані. Список всіх процесів, як у фоновому режимі, так і в режимі зупинки може бути досягнутий шляхом запуску jobs.

Стан процесу можна змінити за допомогою різних команд. Команда "fg" виводить процес на передній план, а "bg"-набір зупиняє процес, що виконується у фоновому режимі. Bg" і "fg" можуть прийняти ідентифікатор роботи в якості свого першого аргументу, щоб вказати, в якому процесі діяти. завершення процесу передчасно, надіславши йому сигнал Ідентифікатор завдання повинен бути вказаний після знаку відсотка:

  • kill -s SIGKILL%1 або kill-9%.

Bash постачає «умовне виконання» роздільникам команд, які виконують команди "contingent" за кодом виходу, встановленим командою прецеденту. Зовнішня команда, яка називається "bashbug", повідомляє про помилки оболонки. Коли команда викликається, вона запускає редактор за промовчанням для користувача із заповненою формою. Форма надсилається сторонам Bash або, можливо, іншим адресам електронної пошти, забезпечивши глобально заміну регулярних виразів Bash.

Коли Bash починає працювати, він виконує різні точкові файли. Навіть за подібними командами сценаріїв, які мають дозвіл на виконання та розпорядження інтерпретатора, наприклад:

  • #!/bin/bash.

Файли ініціалізації, які застосовуються Bash вирази з присвоєнням не вимагають цього. Порядок виконання файлів:

  1. При запуску оболонки він читає і виконує /etc/profile, якщо він є.
  2. Цей файл ініціює /etc/bash.bashrc.
  3. Після визначення цього файлу він шукає ~/.bash_profile, зчитуючи і виконуючи перший, існуючий і читаний.
  4. Якщо оболонка випливає з , він визначає та виконує ~/.bash_logout.
  5. Під час запуску в ролі оболонки він визначає та виконує /etc/bash.bashrc, а потім ~/.bashrc.
  6. Це має можливість заборони через "--norc" опцію.
  7. Параметр "--rcfile" file змушує Bash прочитувати та виконувати його.
  8. Зіставлення з Bourne shell і csh startup виходять з оболонки "Борна" і csh. Вони дозволяють звузити загальне використання файлів з Bourne і дозволити окремі функції запуску, відомі користувачам csh.

Виклик Bash з -posix опцією або вказівка ​​set -o posix у скрипті змушує регулярний вираз для екранування Bash дуже точно відповідати стандарту POSIX 1003.2. Сценарії оболонки, призначені для переносимості, мають принаймні враховувати оболонку Bourne, яку вона має намір замінити. Bash має певні функції, яких не вистачає традиційній оболонці Bourne. До них відносяться:

  1. Деякі розширені опції виклику.
  2. Підстановка команд із використанням нотації $(). Ця функція є частиною POSIX 1003.2.
  3. Розширення дужок.
  4. Деякі операції з масивами та асоціативні масиви.
  5. Розширення тестової конструкції із подвійними дужками.
  6. Арифметико-оцінна конструкція регулярних виразів Bash у "if".
  7. Деякі операції маніпуляції рядком.
  8. Заміна процесу.
  9. Оператор відповідності регулярному виразу.
  10. "Баш"-специфічні вбудовані Coprocesses.

Арифметичні вирази Bash використовують "readline" для надання швидких клавіш та редагування командного рядка з використанням прив'язок клавіш за замовчуванням (Emacs). Vi-прив'язки можуть бути включені при запуску "set-o vi".

Підстановка дужок, яка також називається чергуванням, - це функція, що копіюється з оболонки "C". Вона генерує набір альтернативних комбінацій. Згенеровані результати необов'язково існувати як файлів. Результати кожного розширеного рядка не сортуються та зберігаються у порядку праворуч. Користувачі не повинні використовувати розширення дужок у переносних сценаріях оболонки, тому що оболонка Bourne не робить однакового висновку.

Коли розширення дужки поєднується з знаками підстановки, дужки спочатку розширюються, а потім одержувані знаки підстановки замінюються. На додаток до чергування розширення брекету може використовуватися для послідовних діапазонів між двома цілими числами або символами, поділеними подвійними точками. Нові версії використання регулярних виразів Bash дозволяють третьому цілому числу вказати приріст.

Коли розширення брекета поєднується зі змінним розширенням, воно виконується після розширення брекету, яке в деяких випадках може вимагати використання вбудованого "eval", таким чином:

  • $ start = 1;
  • end = 10 $ echo ($ start.. $ end) # не може розширюватися через порядок оцінки (1..10);
  • $ eval echo ( $ start .. $ end ) # розширення змінної відбувається, тоді результуючий рядок оцінюється: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.

Синтаксичні аспекти мови "Баша"

Сценарії оболонки повинні зберігатися в текстовому файлі ASCII, створеному за допомогою програми «editor», яка не вводить додаткові символи або послідовності для форматування тексту. Наприклад, редактори, які підходять для створення сценаріїв оболонки, - це програми vi або Emacs, доступні в UNIX/Linux, або такі програми, як Блокнот, TextEdit і UltraEdit в Microsoft Windows.

Хорошою практикою є вставка в перший рядок кожного сценарію Bash регулярки, послідовності «#! /Bin/bash», яка показує абсолютний шлях програми у файловій системі машини, на якій потрібно запустити скрипт. Таким чином, можна запустити його безпосередньо в командному рядку, не вказуючи ім'я файлу як аргумент команди bash.

Вказівка ​​програми-перекладача, яка використовуватиметься операційною системою для перекладу та виконання інструкцій скрипта, надається в першому рядку самого скрипта, одразу після послідовності символів «#!». Вважається, що виконуваний файл інтерпретатора знаходиться в каталозі /bin, але в різних системах він може бути встановлений в інших каталогах, наприклад:

  • "/usr/bin", "/usr/local/bin".

У загальному випадку символ # дозволяє вводити коментар у джерелі сценарію. Будь-який символ у рядку сценарію після символу "#" ігнорується командним інтерпретатором. Фактично він часто використовується для вставлення коментарів у джерело сценарію для опису його роботи або пояснення впливу конкретних команд. Як і при вставці команд в інтерактивному режимі, навіть при кодуванні скрипту, кожна інструкція програми може бути записана на окремому рядку або розбита на кілька рядків і закінчує кожний рядок, крім останнього символом "\". Додаткові вказівки можна повідомляти в тому ж рядку, використовуючи «;».

Інструкції програми можуть бути «відступом», щоб зробити вихідний код більш зручним для читання, але слід звернути увагу на використання пробілів. Інтерпретатор Bash більш "розбірливий", ніж інші інтерпретатори або компілятори, і в деяких випадках не допускається вставлення довільних просторів між членами, що складають інструкції, в інших випадках використання простору має важливе значення для правильної інтерпретації інструкції.

Немає жодних символів для розмежування блоків інструкцій, вставлених у структуру управління, наприклад, які мають повторюватися в структурі ітеративного управління. З іншого боку, існують відповідні мовні ключові слова, які дозволяють правильно ідентифікувати початок та кінець блоку. Ці ключові слова різняться залежно від інструкції, яка використовується для керування потоком програми. У синтаксисі прикладів "match" регулярних виразів Bash деякі символи набувають особливого значення, тобто якщо вони присутні в рядку символів або як аргумент команди, то виконують дуже точну функцію.

З мінімальним спрощенням можна сказати, що оболонка - це програма, яка інтерактивно завжди виконує ту саму операцію. Вона очікує введення команди як вхідні дані, оцінює її, щоб переконатися, що команда синтаксично коректна, і виконує її, потім повертається, щоб чекати наступної команди. Цей процес закінчується, коли оболонка отримує сигнал, що вказує на те, що вхід завершено і ніякі інші команди не будуть відправлені на нього. У цей момент завершується програма оболонки, звільняючи виділену пам'ять та інші машинні ресурси, доступні операційній системі.

Сценарій запускається автоматично операційною системою, коли користувач входить у саму систему, тобто може бути виконаний користувачем за допомогою команди, заданої на відкритій оболонці, або за допомогою спеціальних графічних утиліт, якщо він працює з системою з графічним інтерфейсом користувача. Наприклад, на комп'ютері Apple Macintosh під керуванням Mac OS X можна використовувати командну оболонку, запустивши утиліту Terminal, розташовану в Utility в папці "Додаток".

На робочій станції Linux з графічним менеджером робочого столу, наприклад GNOME або KDE, можна відкрити командну оболонку, вибравши програму «Термінал» з меню «Програми → Аксесуари». Після активації командної оболонки можна переглянути ім'я оболонки, що використовується, виконавши наступні команди:

  • $ echo;
  • $SHELL /bin/bash.

Якщо стандартна оболонка не є Bash, можна перевірити, чи є вона в системі в одному з каталогів, перерахованих в змінному середовищі PATH, використовуючи команду «which», і виконати її за допомогою команди «bash»:

  • $ echo $SHELL /bin/tcsh $ which bash /bin/bash $ bash bash-2.03$.

Оболонка, таким чином, працює в інтерактивному режимі, отримуючи вхідні дані в кожну окрему команду та параметри, вказані в командному рядку, та виконуючи саму команду. Висновок відображається у тому ж вікні терміналу. Кожна команда, що передається оболонці, закінчується натисканням кнопки Invio/Enter. Можна випустити кілька команд в одному рядку, відокремлюючи їх один від одного символом ";". Також можна розбити вставку команди на два або більше рядків, закінчуючи кожний проміжний рядок символом "\".

Зазвичай мовами програмування лапки та подвійні лапки використовуються для розмежування рядків, а використання одного або іншого символу залежить від синтаксису, прийнятого певною мовою. У мовах сценаріїв використання лапок та зворотних посилань має інше значення, і Bash у цьому не є винятком.

Поодинокі лапки використовуються для розмежування рядків символів. Інтерпретатор не входить у вміст рядка і просто використовує послідовність символів, розділених лапками. Таким чином, символи, які інакше набувають іншого значення, також можуть бути частиною рядка. Єдиний символ, який не може використовуватися в рядку, обмеженому лапками, - це ті самі лапки. Для визначення такого рядка необхідно розмежувати його лапками.

Для розмежування рядків використовуються подвійні лапки, проте якщо рядок обмежений цим символом, інтерпретатор виконує так звану інтерполяцію і дозволяє значення будь-яких змінних в регулярних виразах Bash в рядку. Насправді якщо у рядку, укладеної в подвійні лапки, є посилання змінну, то рядку ім'я змінної замінюється її значенням. Щоб надрукувати символи, наприклад подвійні лапки або долар, які б інакше інтерпретувалися і приймали інше значення, необхідно прописувати префікс кожного з них символом « » зворотної косої риси. Щоб надрукувати символ зворотної косої риси у рядку, обмеженому подвійними лапками, потрібно повернути дві зворотні косі риси.

Характер зворотного ходу має найбільш характерну поведінку, типову для мов сценаріїв, і відсутня на основних мовах програмування високого рівня. Лапка дозволяє розмежувати рядок, який інтерпретується Bash як команда і повинен бути виконаний, повертаючись як значення вихідних даних на той же продукт каналу вихідного стандарту.

Якщо потрібно виконати оболонку таким чином, щоб вона обробляла послідовність команд, які показані в текстовому файлі ASCII:

  • $ pwd;
  • echo $SHELL;
  • hostaname /home/marco /bin/bash aquilante $ echo \ > $SHELL /bin/bash.

Якщо потрібно підготувати файл під назвою "script.sh", який зберігається в домашньому каталозі, вміст файлу може бути наступним:

  • echo -n "Oggi e" il " 2 date +%d/%m/%Y.

Запускають цей дуже простий скрипт, вказавши ім'я файлу в командному рядку, з якого викликається оболонка:

  • $ bash script.sh Oggi e"il 10/6/2011.

Оболонка може приймати послідовність команд для виконання через канал, який перенаправляє виведення іншої команди на стандартний вхід Bash:

  • $ cat script.sh | bash Oggi e" il 10/6/2011.

Можна виділити рядок регулярних виразів Bash-програми із позначенням «#!». Абсолютний шлях інтерпретатора, який використовуватиметься для виконання скрипта, запускають безпосередньо без ОС, запустивши Bash і передавши скрипт у вхід:

  • $ cat script.sh #!/bin/bash echo -n "Oggi e" il " date +%d/%m/%Y $ chmod 755 script.sh $ ls -l script.sh -rwxr-xr-x 1 marco users 49 18 Apr 23:58 script.sh $ ./script.sh Oggi e" il 10/6/2011.

В останній команді попереднього прикладу, що безпосередньо викликає виконання скрипту, що зберігається у файлі «script.sh», що знаходиться в поточному каталозі, вказаний відносний шлях «./» до імені файлу. Необхідно вказати шлях до каталогу, в якому знаходиться скрипт, що виконується, тому що часто з міркувань безпеки поточний каталог відсутній у списку каталогів, в яких оболонка повинна шукати зовнішні команди, що виконуються. Список таких каталогів зберігається у змінних регулярних виразах Bash.

Переваги операційної системи з Bash

Це найефективніша мова сценаріїв оболонки. Він дає користувачеві простий спосіб автоматизувати роботу, якщо він уже знайомий із застосуванням оболонки в інтерактивному режимі. Якщо розробник програмує системи, він повинен знати, як працює оболонка.

Якщо порівняти скрипти з вивченням конфігурації або системи автоматизації "yaml" або "json", вони набагато універсальніші. Сценарії Bash простіші, тому що скрипт працює за умовчанням.

Bash - простіша мова, і це змушує розробників зосередитися на інших складностях системи. Беш чудово працює для написання оболонки. Все інше переважно або використовує оболонку для команд, або реалізує свою власну оболонку, копіюючи хороші частини з неї. Крім того, існують хороші конструктори регулярних виразів Bash, які спрощують роботу з оболонкою.

За допомогою Bash розробники можуть використовувати інтерактивний веб-досвід, застосовуючи досвід командного рядка Linux без меж часу та місця. Для використання цієї можливості не потрібні суворі правила та зусилля, і користувачі можуть отримати доступ до автентифікованої робочої станції, керуючи ресурсами та середовищем Azure одним кліком, навіть коли вони використовують мобільні програми Azure, Azure Portal та Azure Documentation.

На відміну від традиційного середовища командного рядка, немає необхідності встановлювати та вибирати інструменти перед початком роботи та можна заощадити час та зусилля за допомогою Bash. Всі інструменти CLI, такі як текстові, збірки, контейнери та вихідні доступні в Bash, можна використовувати безпечну і просту автентифікацію інструментів за допомогою CLI 2.0.

Ми розглянули приклади регулярних виразів Bash. Успіхів у освоєнні!

Регулярний вираз- текстовий шаблон, що складається з комбінації букв, цифр та спецсимволів, відомих як метасимволи. Близьким родичем регулярних виразів є вирази з групових символів, які часто використовуються в керуванні файлами. Регулярні вирази використовуються в основному для порівняння тексту та пошуку. Широко використовуються для аналізу синтаксису.

Користувачі UNIX знайомі з регулярними виразами за програмами grep, sed, awk (або gawk) та ed. За допомогою цих програм або їх аналогів можна випробувати і перевірити наведені нижче приклади. Текстові редактори, такі як (X)Emacs та vi, також активно використовують регулярні вирази. Можливо, найвідоміше та найширше використання регулярних виразів має місце у мові Perl. Без знання регулярних виразів важко обійтися розробнику програмного забезпечення та системному адміністратору.

Метасимволи

Отже, рядки можуть складатися з букв, цифр та метасимволів. Метасимволами є:

\ | () { } ^ $ * + ? . < >

Метасимволи можуть відігравати в регулярному вираженні такі ролі:

    квантифікатор

    затвердження;

    знак групи;

    альтернатива;

    знак послідовності

Квантифікатори

Метасимвол * (зірочка) замінює 0 або кілька символів. Метасимвол + (плюс) замінює 1 або кілька символів. Метасимвол. (Точка) замінює собою рівно 1 довільний символ. Метасимвол? (запитувальний знак) замінює собою 0 або 1 символ. Відмінність у використанні * та + така, що запит на пошук рядка с* дасть будь-які рядки, включаючи порожні, а запит з+ - лише рядки, що містять символ с.

Порожні рядки підпорядковуються наступним домовленостям: у порожньому рядку міститься один і лише один порожній рядок; у порожньому рядку порожні рядки містяться перед кожним символом, а також в кінці рядка.

У регулярних виразах використовується також конструкція (n, m), що означає, що символ, що йде перед конструкцією, зустрічається в рядку від n до m разів. Опускаючи число m маємо на увазі нескінченність. Тобто. приватними випадками конструкції є такі записи: (0,), (1,) та (0,1). Перша відповідає *, друга - метасимвол +, а третя -? . Ці рівності легко одержати з визначення відповідних квантифікаторів. Крім того, конструкція (n) означає, що символ зустрічається рівно n разів.

У зв'язку з використанням як метасимволів деяких розділових знаків і математичних символів введено додатковий метасимвол \ (backslash, зворотна коса риса), який будучи записаний перед метасимволом перетворює останній на звичайний символ. Тобто. ? - це квантифікатор, а \? - знак питання.

Групи

Описані вище квантифікатори, як говорилося, діють на найближчий до них ліворуч символ (останній попередній). Але це обмеження дозволяють обійти групи, в позначенні яких використовуються метасимволи (і). Ці символи виділяють з виразу подвыражение, що об'єднується в групу, якого потім і застосовується квантифікатор.

Приклад:

означає (або замінює собою)

Ho ho ho ho ho ho hohoho

Можливі вкладення подвыражений, тобто. з подвыражения можна виділяти подвыражения меншої довжини.

Альтернативи

Утворюються за допомогою метасимволу (вертикальна характеристика), що означає логічне «або».

приклад: регулярне вираження корів(а|и|е|у|ою|ою)? задає всі можливі відмінювання слова «корова» в однині за відмінками.

Твердження

Виділяються метасимволи, які позначають спеціальні об'єкти - рядки нульової довжини, які служать визначення місця попереднього ним чи наступного їх тексту. Такі об'єкти називаються твердженнями. У регулярних висловлюваннях існують такі твердження:

^ початок рядка $ кінець рядка< начало слова >кінець слова

приклад: регулярний вираз $The дозволяє знайти рядок, що починається з The .

Примітка: звичайні символи можна розглядати як затвердження із ненульовою довжиною.

Послідовності

Особлива конструкція, укладена в метасимволи [і] (прямокутні дужки), дозволяє перерахувати варіанти символів, які можуть стояти в регулярному виразі на даному місці, і називається послідовністю. Усередині прямокутних дужок всі метасимволи трактуються як прості символи, а символи - (мінус) і ^ набувають нових значень: перший дозволяє задати безперервну послідовність символів між двома вказаними, а другий дає логічне «не» (заперечення). Найпростіше розглянути такі приклади:

якась із малих латинських літер:

латинський буквено-цифровий символ (від a до z, від A до Z та від 0 до 9):

символ, що не є латинським буквенно-цифровим:

[^a-zA-Z0-9]

будь-яке слово (без дефісів, математичних символів та цифр):

<+>

Для стислості та простоти вводяться такі скорочення:

\d цифра (тобто відповідає виразу); \D не цифра (тобто [^0-9]); латинське слово (літерно-цифрове); \W послідовність символів без пробілів, що не є латинським буквенно-цифровим словом ([^a-zA-Z0-9]); \s порожній проміжок [\t\n\r\f], тобто. прогалини, табуляції і т.д. \S непустий проміжок ([^ \t\n\r\f]).

Зв'язок із груповими символами

З груповими символами знайомий, мабуть, кожен користувач. Приклад виразу з використанням групового символу є запис *.jpg, що позначає всі файли з розширенням jpg. Чим же регулярні вирази від групових символів? Відмінності можна підсумовувати у трьох правилах перетворення довільного виразу з груповими символами на регулярне вираз:

    Замінити на.*

    Замінити? на.

    Замінити всі символи, що збігаються з метасимволами, на їх бекслешовані варіанти.

Справді, у регулярному вираженні запис * некорисний і дає порожній рядок, т.к. означає, що порожній рядок повторюється скільки завгодно разів. А ось.* (повторити довільний символ скільки завгодно багато разів, включаючи 0) якраз збігається за змістом із символом * у безлічі групових символів.

Регулярний вираз, що відповідає *.jpg , виглядатиме так: .*\.jpg . А, наприклад, послідовності групових символів ez*.pp відповідають два еквівалентні регулярні вирази - ez.*\.pp і ez.*\.(cpp|hpp) .

Приклади регулярних виразів

E-mail у форматі [email protected]

+(\.+)*@+(\.+)+

E-mail у форматі "Іван Іванов "

("?+"?[\t]*)+\<+(\.+)*@+(\.+)+\>

Перевірка веб-протоколу в URL (http://, ftp:// або https://)

+://

Деякі команди та директиви C/C++:

^#include[ \t]+[<"][^>"]+[">] - директива include

//.+$ - коментар на одному рядку

/\*[^*]*\*/ - коментар на декількох рядках

-?+\.+ - число з плаваючою точкою

0x+ - число у шістнадцятковій системі числення.

А ось, наприклад, програма пошуку слова cow:

grep -E "cow|vache" * >/ dev/ null && echo "Found a cow"

Тут опція E використовується для включення підтримки розширеного синтаксису регулярних виразів.

Текст складено на основі статті Жана Борсоді (Jan Borsodi) із файлу HOWTO-regexps.htm

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

  • Перевірка введення тексту;
  • Пошук та заміна тексту у файлі;
  • Пакетне перейменування файлів;
  • Взаємодія із сервісами, такими як Apache;
  • Перевірка рядка на відповідність шаблону.

Це далеко не повний список, регулярні висловлювання дозволяють робити набагато більше. Але для нових користувачів вони можуть здатися надто складними, оскільки для їхнього формування використовується спеціальна мова. Але враховуючи можливості, регулярні вирази Linux повинен знати і вміти використовувати кожен системний адміністратор.

У цій статті ми розглянемо регулярні вирази bash для початківців, щоб ви змогли розібратися з усіма можливостями цього інструменту.

У регулярних виразах можуть використовуватися два типи символів:

  • звичайні літери;
  • метасимволи.

Звичайні символи - це літери, цифри та розділові знаки, з яких складаються будь-які рядки. Всі тексти складаються з літер і ви можете використовувати їх у регулярних виразах для пошуку потрібної позиції у тексті.

Метасимволи – це дещо інше, саме вони дають силу регулярним виразам. За допомогою метасимволів ви можете зробити набагато більше, ніж пошук одного символу. Ви можете шукати комбінації символів, використовувати їх динамічну кількість і вибирати діапазони. Всі спецсимволи можна розділити на два типи, це символи заміни, які замінюють собою звичайні символи, або оператори, які вказують скільки разів може повторюватися символ. Синтаксис регулярного виразу виглядатиме таким чином:

звичайний_символ спецсимвол_оператор

спецсимвол_заміни спецсимвол_оператор

  • \ - зі зворотної косою риси починаються буквені спецсимволи, а також він використовується якщо потрібно використовувати спецсимвол у вигляді будь-якого розділового знака;
  • ^ - Вказує на початок рядка;
  • $ - Вказує на кінець рядка;
  • * - Вказує, що попередній символ може повторюватися 0 або більше разів;
  • + - вказує, що попередній символ повинен повторитися більше одного або більше разів;
  • ? - Попередній символ може зустрічатися нуль або один раз;
  • (n)- Вказує скільки разів (n) потрібно повторити попередній символ;
  • (N,n)- Попередній символ може повторюватися від N до n разів;
  • . - будь-який символ, окрім перекладу рядка;
  • - будь-який символ, вказаний у дужках;
  • х|у- Символ x або символ y;
  • [^az]- будь-який символ, крім тих, що вказані у дужках;
  • - будь-який символ із зазначеного діапазону;
  • [^a-z]- будь-який символ, якого немає у діапазоні;
  • \b- позначає межу слова з пропуском;
  • \B- означає, що символ повинен бути всередині слова, наприклад, ux збігається з uxb або tuxedo, але не збігається з Linux;
  • \d- означає, що символ – цифра;
  • \D- нецифровий символ;
  • \n- Символ перекладу рядка;
  • \s- один із символів пробілу, пробіл, табуляція тощо;
  • \S- будь-який символ крім пробілу;
  • \t- Символ табуляції;
  • \v- Символ вертикальної табуляції;
  • \w- будь-який літерний символ, включаючи підкреслення;
  • \W- будь-який літерний символ, крім підкреслення;
  • \uXXX- Unicdoe символ.

Важливо, що перед літерними спецсимволами потрібно використовувати косу межу, щоб вказати, що далі йде спецсимвол. Правильно і зворотне, якщо ви хочете використовувати спецсимвол, який застосовується без косої межі як звичайний символ, то вам доведеться додати косу межу.

Наприклад, ви хочете знайти у тексті рядок 1+2=3. Якщо ви використовуєте цей рядок як регулярний вираз, то нічого не знайдете, тому що система інтерпретує плюс як спецсимвол, який повідомляє, що попередня одиниця повинна повторитися один або більше разів. Тому його потрібно екранувати: 1 \+ 2 = 3. Без екранування наш регулярний вираз відповідав би лише рядку 11=3 або 111=3 тощо. Перед одною рису ставити не потрібно, тому що це не спецсимвол.

Приклади використання регулярних виразів

Тепер, коли ми розглянули основи і ви знаєте, як все працює, залишилося закріпити отримані знання про регулярні вирази linux grep на практиці. Два дуже корисні спецсимволи – це ^ і $, які позначають початок та кінець рядка. Наприклад, ми хочемо отримати всіх користувачів, зареєстрованих у нашій системі, ім'я яких починається на s. Тоді можна застосувати регулярний вираз "^s". Ви можете використовувати команду egrep:

egrep "^s" /etc/passwd

Якщо ми хочемо відбирати рядки за останнім символом у рядку, то для цього можна використовувати $. Наприклад, виберемо всіх системних користувачів, без оболонки, записи про таких користувачів закінчуються на false:

egrep "false$" /etc/passwd

Щоб вивести імена користувачів, які починаються на s або d, використовуйте такий вираз:

egrep "^" /etc/passwd

Такий самий результат можна отримати, використовуючи символ "|". Перший варіант більш придатний для діапазонів, а другий частіше застосовується для звичайних або/або:

egrep "^" /etc/passwd

Тепер давайте виберемо всіх користувачів, довжина імені яких становить не три символи. Ім'я користувача завершується двокрапкою. Ми можемо сказати, що воно може містити будь-який літерний символ, який має бути повторений три рази, перед двокрапкою:

egrep "^\w(3):" /etc/passwd

Висновки

У цій статті ми розглянули регулярні вирази Linux, але це були лише основи. Якщо копнути трохи глибше, ви знайдете, що за допомогою цього інструменту можна робити набагато більше цікавих речей. Час, витрачений на освоєння регулярних виразів, однозначно буде вартий того.

На завершення лекція від Яндекса про регулярні вирази:

© 2023 androidas.ru - Все про Android