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:

Передісторія та джерело:в повному обсязі, кому доводиться використовувати регулярні висловлювання, остаточно розуміють, як вони працюють і як створювати. Я теж ставився до цієї групи - шукав приклади регулярних виразів, що підходять під мої завдання, намагався підправити їх у міру необхідності. Для мене все докорінно змінилося після прочитання книги Linux Command Line (Second Internet Edition)автора William E. Shotts, Jr.У ній принципи роботи регулярних виразів викладені настільки ясно, що після прочитання я навчився їх розуміти, створювати регулярні вирази будь-якої складності і тепер використовую їх за кожної потреби. Цей матеріал є перекладом частини глави, присвяченої регулярним виразам. Цей матеріал призначений для абсолютних новачків, які зовсім не розуміють, як працюють регулярні вирази, але мають деякі уявлення про роботу. Сподіваюся, ця стаття допоможе вам зробити такий самий прорив, який допоміг мені. Якщо викладений тут матеріал не містить нічого нового для вас, спробуйте подивитися статтю «Регулярні вирази та команда grep», в ній детальніше описуються опції grep, а також є додаткові приклади.

Як використовуються регулярні вирази

Текстові дані відіграють важливу роль у всіх Unix-подібних системах, таких як Linux. Серед іншого текстом є і виведення консольних програм, і файли конфігурації, звітів і т.д. Регулярні виразиє (мабуть) однією з найскладніших концепцій роботи з текстом, оскільки передбачають високий рівень абстракції. Але час, витрачений з їхньої вивчення, з лишком окупиться. Вміючи використовувати регулярні висловлювання, ви зможете робити дивовижні речі, хоча їхня повна цінність може бути не відразу очевидною.

У цій статті буде розглянуто використання регулярних виразів разом із командою grep. Але їх застосування не обмежується тільки цим: регулярні вирази підтримуються іншими командами Linux, багатьма мовами програмування, застосовуються при конфігурації (наприклад, в налаштуваннях правил mod_rewrite в Apache), а також деякі програми з графічним інтерфейсом дозволяють встановлювати правила пошуку/копіювання/видалення з підтримкою регулярних виразів. Навіть у популярній офісній програмі Microsoft Word для пошуку та заміни тексту ви можете використовувати регулярні вирази та символи підстановки.

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

Говорячи простою мовою, регулярне вираз – це умовне позначення, символічний запис шаблону, який шукається у тексті. Регулярні вирази підтримуються багатьма інструментами командного рядка та більшістю мов програмування та застосовуються для полегшення вирішення проблем із текстовими маніпуляціями. Проте (начебто мало їх складності), в повному обсязі регулярні висловлювання однакові. Вони трохи змінюються від інструмента до інструменту та від мови програмування до мови. Для нашого обговорення ми обмежимося регулярними виразами, описаними в стандарті POSIX (який охоплюватиме більшість інструментів командного рядка), на відміну від багатьох мов програмування (насамперед Perl), які використовують дещо більші та багатші набори нотацій.

grep

Основною програмою, яку ми використовуватимемо для регулярних виразів, є наш старий приятель, . Ім'я "grep" насправді походить від фрази "global regular expression print", тому ми можемо бачити, що grep має якесь відношення до регулярних виразів. По суті, grep шукає у текстових файлах текст, який підходить під вказане регулярне вираз і виводить у стандартний висновок будь-який рядок, що містить відповідність.

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

Ls /usr/bin | grep zip

Ця команда виведе список файлів у директорії /usr/bin, імена яких містять підрядок «zip».

Програма grep може шукати текст у файлах.

Загальний синтаксис використання:

Grep [опції] regex [файл...]

  • regex- Це регулярне вираження.
  • [файл…]- один або кілька файлів, в яких буде проводитися пошук за регулярним виразом.

[опції] та [файл…] можуть бути відсутніми.

Список часто використовуваних опцій grep:

Опція Опис
-i Ігнорувати регістр. Не робити відмінності між великими та маленькими символами. Також можна задати опцію --ignore-case.
-v Інвертувати відповідність. Зазвичай grep друкує рядки, які містять відповідність. Ця опція призводить до того, що grep виводить кожен рядок, який не містить відповідності. Також можна використовувати --invert-match.
-c Друкувати кількість відповідностей (або невідповідностей, якщо вказано опцію -v) замість самих рядків. Можна також вказувати опцією --count.
-l Замість рядків друкувати ім'я кожного файлу, який містить відповідність. Можна вказати опцією --files-with-matches.
-L Як опція -l, але друкує лише імена файлів, які не містять збігів. Інше ім'я опції --files-withoutmatch.
-n Додавання до початку кожного рядка номера рядка всередині файлу. Інше ім'я опції --line-number.
-h Щоб знайти кілька файлів, придушувати виведення імені файлу. Також можна вказати опцією --no-filename.

Щоб повніше дослідити grep, давайте створимо кілька текстових файлів для пошуку:

Ls /bin > dirlist-bin.txt ls /usr/bin > dirlist-usr-bin.txt ls /sbin > dirlist-sbin.txt ls /usr/sbin > dirlist-usr-sbin.txt ls dirlist*.txt dirlist -bin.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt

Ми можемо здійснити простий пошук за нашим списком файлів таким чином:

Grep bzip dirlist*.txt dirlist-bin.txt:bzip2 dirlist-bin.txt:bzip2recover

У цьому прикладі grep шукає по всіх перерахованих файлах рядок bzip і знаходить дві відповідності, обидва у файлі dirlist-bin.txt. Якщо нас цікавить лише список файлів, які містять відповідності, а не самі відповідні рядки, ми можемо вказати опцію -l:

Grep -l bzip dirlist*.txt dirlist-bin.txt

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

Grep -L bzip dirlist*.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt

Якщо висновок відсутній - це означає, що файли, що задовольняють умовам, не знайдені.

Метасимволи та літерали

Хоча це може здатися неочевидним, наші пошуки з grep завжди використовують регулярні вирази, хоч і дуже прості. Регулярний вираз «bzip» означає, що збіг відбуватиметься (тобто рядок буде вважатися відповідним) тільки в тому випадку, якщо рядок у файлі містить не менше чотирьох символів і десь у рядку символи «b», «z» , "i" та "p" знаходяться в цьому порядку, без інших символів між ними. Символи у рядку «bzip» є літералами, тобто. буквальними символамиоскільки вони відповідають самим собі. Крім літералів, регулярні вирази можуть також включати метасимволи, які використовуються для завдання складніших збігів. Метасимволи регулярного вираження складаються з:

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

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

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

Будь-який символ

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

Grep -h ".zip" dirlist*.txt bunzip2 bzip2 bzip2recover gunzip gzip funzip gpg-zip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx

Ми шукали будь-який рядок у наших файлах, який відповідає регулярному виразу ".zip". Потрібно відзначити кілька цікавих моментів в отриманих результатах. Зверніть увагу, що програму zip не було знайдено. Це від того, що включення метасимволу крапка в наш регулярний вираз збільшило довжину, необхідну для збігу, до чотирьох символів, а оскільки ім'я «zip» містить лише три, воно не відповідає. Також якщо будь-які файли з наших списків містили розширення файлу.zip, вони також вважалися б відповідними, оскільки символ точки в розширенні файлу також підходить під умову «будь-який символ».

Анкори

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

Grep -h "^zip" dirlist*.txt zip zipcloak zipdetails zipgrep zipinfo zipnote zipsplit grep -h "zip$" dirlist*.txt gunzip gzip funzip gpg-zip mzip p7zip preunzip prezip unzip zip grep -h "^zip$" dirlist *.txt zip

Тут ми шукали за списками файлів рядок «zip», розташований на початку рядка, наприкінці рядка, а також у рядку, де він був би одночасно і на початку, і наприкінці (тобто весь рядок містив би лише «zip») ). Зверніть увагу, що регулярний вираз « ^$ »(початок і кінець між якими нічого немає) буде відповідати порожнім рядкам.

Невеликий ліричний відступ: помічник з розгадування кросвордів

Навіть із нашими обмеженими на даний момент знаннями в регулярних виразах ми можемо робити щось корисне.

Якщо ви коли-небудь розгадували кросворди, вам потрібно було вирішувати завдання на кшталт «що за слово з п'яти букв, де третя буква «j», а остання буква «r», що означає…». Це питання може змусити замислитись. Чи знаєте ви, що у системі Linux є словник? А він є. Завітайте до директорії /usr/share/dict, там ви можете знайти один або кілька словників. Словники, які розміщені там, це просто довгі списки слів по одному на рядок, розташовані в алфавітному порядку. У моїй системі файл словника містить 99 171 слів. Для пошуку можливих відповідей на вищенаведене питання кросворду ми можемо зробити так:

Grep -i "^..j.r$" /usr/share/dict/american-english Major major

Використовуючи цей регулярний вираз, ми можемо знайти всі слова в нашому файлі словника, який має довжину п'ять літер, має «j» у третій позиції та «r» в останній позиції.

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

Вирази у квадратних дужках та Класи символів

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

Grep -h "zip" dirlist*.txt bzip2 bzip2recover gzip

ми знайдемо будь-які рядки, що містять рядки "bzip" або "gzip".

Набір може містити будь-яку кількість символів, а метасимволи втрачають своє спеціальне значення, коли поміщаються всередину квадратних дужок. Тим не менш, є два випадки, в яких метасимволи, що використовуються всередині квадратних дужок, мають різні значення. Перший - це каретка ( ^ ), яка використовується для вказівки заперечення; другий - це тире ( - ), яке використовується для вказівки діапазону символів.

Заперечення

Якщо першим символом вираження у квадратних дужках є каретка ( ^ ), то решта символів приймається як набір символів, які не повинні бути присутніми в заданій позиції символу. Зробимо це, змінивши наш попередній приклад:

Grep -h "[^bg]zip" dirlist*.txt bunzip2 gunzip funzip gpg-zip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx

З активованим запереченням ми отримали список файлів, які містять рядок «zip», перед яким йде будь-який символ, крім «b» або «g». Зверніть увагу, що zip не було знайдено. Набір символів, що заперечується, все одно вимагає символ на заданій позиції, але символ не повинен бути членом інвертованого набору.

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

Традиційні діапазони символів

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

Grep -h "^" dirlist*.txt MAKEDEV GET HEAD POST VBoxClient X X11 Xorg ModemManager NetworkManager VBoxControl VBoxService

Суть у тому, що ми розмістили всі 26 великих букв у вираз усередині квадратних дужок. Але думка друкувати їх не викликає ентузіазму, тому є інший шлях:

Grep -h "^" dirlist*.txt

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

Grep -h "^" dirlist*.txt

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

Grep -h "" dirlist*.txt

Це буде відповідати кожному імені файлу, що містить велику літеру. При цьому:

Grep -h "[-AZ]" dirlist*.txt

буде відповідати кожному імені файлу, що містить тире, або заголовну "A", або заголовну "Z".

Регулярні вирази 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. Успіхів у освоєнні!

Утиліта grep – це дуже потужний засіб для пошуку та фільтрації текстової інформації. У цій статті показано кілька прикладів її використання, які дозволять належним чином оцінити її можливості.
Основна сфера застосування grep – пошук слів чи фраз у файлах та потоках виведення. Ви можете здійснити пошук, набравши в командному рядку запит та область пошуку (файл).
Наприклад, щоб знайти рядок “needle” у файлі hystack.txt використовуйте таку команду:

$grep needle haystack.txt

В результаті grep відобразить усі входження needle, які він зустріне у вмісті файлу haystack.txt. Важливо зауважити, що в цьому випадку grep шукає саме набір символів, а не слово. Наприклад, буде відображено рядки, що включають слово “needless” та інші слова, у яких зустрічається послідовність “needle”.


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

$grep -w needle haystack.txt

Не обов'язково обмежувати область пошуку лише одним файлом, grep може виконувати пошук і за групою файлів, причому у результатах пошуку буде вказано файл, у якому виявлено збіг. Ключ -n додасть ще номер рядка, в якому виявлено збіг, а ключ -r дозволить виконати рекурсивний пошук. Це дуже зручно під час пошуку серед файлів з вихідними текстами програм.

$ grep -rnw function_name /home/www/dev/myprogram/

Ім'я файлу буде вказано перед кожним збігом. Якщо вам необхідно приховати імена файлів, скористайтеся ключем -h, навпаки, якщо потрібні лише імена файлів, то вкажіть ключ -l
У наступному прикладі ми здійснимо пошук URL-адрес у лог-файлі IRC і покажемо останні 10 збігів.

$grep-wo http://.*channel.log | tail

Параметр -o показує grep, що слід виводити лише збіг із шаблоном, а чи не весь рядок. Висновок grep за допомогою pipe перенаправляємо команді tail, яка за умовчанням виводить 10 останніх рядків.
Тепер ми підрахуємо кількість повідомлень, надісланих до irc-каналу певними користувачами. Наприклад, всі повідомлення, які я надіслав з дому та з роботи. Вони відрізняються за нікнеймом, вдома я використовую нік user_at_home, а на роботі user_at_work.

$ grep -c "^user_at_(home|work)" channel.log

З параметром -c grep виводить лише кількість знайдених збігів, а чи не самі збіги. Рядок пошуку укладено в лапки тому, що в ній містяться спеціальні символи, які можуть бути розпізнані оболонкою як керуючі. Зверніть увагу, що лапки не входять до шаблону пошуку. Зворотний слеш "" служить для екранування службових символів.
Здійснимо пошук за повідомленнями людей, які люблять “кричати” у каналі. Під “криком” ми розуміємо повідомлення, написані в blondy-style, одними величезними літерами. Щоб виключити з пошуку випадкові попадання абревіатур, шукатимемо слова з п'яти і більше символів:

$ grep -w "+(5,)" channel.log

За більш детальним описом можна звернутися до сторінки посібника man grep.
Ще кілька прикладів:

# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

Відображає рядки з файлу /etc/passwd, де є рядок root.

# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin

Відображаються, крім того, номери рядків, у яких є рядок, що шукається.

# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin :/sbin/halt news:x:9:13:news:/var/spool/news: mailnull:x:47:47::/var/spool/mqueue:/dev/null xfs:x:43:43: X Font Server:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper RPC user:/:/bin/false nscd:x:28:28:NSCD Daemon:/:/bin/false named:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP /var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false

Перевіряється, хто з користувачів не використовує bash, виключаючи ті облікові записи користувачів, у яких як оболонка вказаний nologin.

# grep -c false /etc/passwd 7

Підраховує кількість облікових записів, у яких командною оболонкою вказано /bin/false.

# grep -i games ~/.bash* | grep -v history

У цій команді відображаються рядки з усіх файлів домашнього каталогу поточного користувача, імена яких починаються з ~/.bash, за винятком тих файлів, в іменах яких є рядок history, щоб виключити відповідності, наявні у файлі ~/.bash_history, в якому може бути зазначений один і той же рядок у верхньому або нижньому регістрах. Зверніть увагу, що здійснюється пошук слова "games", замість нього можна підставити будь-яке інше.
Команда grep та регулярні вирази

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

# grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash

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

# grep:$ /etc/passwd news:x:9:13:news:/var/spool/news:

Щоб перевірити, чи експортується змінна PATH у файлі ~/.bashrc, спочатку виберіть рядки з «export», а потім знайдіть рядки, що починаються з рядка «PATH»; у такому разі не будуть відображатися MANPATH та інші можливі шляхи:

# grep export ~/.bashrc | grep "PATH" export PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

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

Виразом у квадратних дужках є список символів, укладених усередині символів [" та "]"". Воно відповідає будь-якому одиночному символу, зазначеному у цьому списку; якщо перший символ списку є «^», воно відповідає будь-якому символу, який ВІДСУТНІЙ у списку. Наприклад, регулярне вираз "" відповідає будь-якій одиночній цифрі.

Всередині виразу у квадратних дужках можна вказувати діапазон, що складається із двох символів, розділених дефісом. Тоді вираз відповідає будь-якому одиночному, який згідно з правилами сортування потрапляє всередину цих двох символів, включаючи ці два символи; при цьому враховується послідовність упорядкування та набір символів, вказаних у локалі. Наприклад, коли за умовчанням вказано локаль C, вираз "" еквівалентний виразу "". Є багато локалей, в яких сортування виконується в словниковому порядку, і в цих локалях "", як правило, не еквівалентно "", в них, наприклад, воно може бути еквівалентним виразу "". Щоб використовувати традиційну інтерпретацію виразу, що вказується у квадратних дужках, ви можете скористатися локаллю C, встановивши для цього в змінній оточенні LC_ALL значення «C».

Нарешті, є певним чином названі символьні класи, які вказуються всередині виразів у квадратних дужках. Додаткову інформацію про ці зумовлені вирази дивіться на сторінках man або документації команди grep.

# grep /etc/group sys:x:3:root,bin,adm tty:x:5: mail:x:12:mail,postfix ftp:x:50: nobody:x:99: xfs:x:43: nfsnobody:x:65534: postfix:x:89:

У прикладі відображаються всі рядки, що містять символ «y», або символ «f».
Універсальні символи (метасимволи)

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

# grep " /usr/share/dict/words catch clash cloth coach couch cough crash crush

Якщо ви бажаєте відобразити рядки, в яких є символ точки у вигляді літералу, то вкажіть у команді grep параметр -F. Символи< " и «>» означають наявність порожнього рядка до та відповідно після вказаних літер. Це означає, що слова у файл words мають бути записані відповідним чином. Якщо ви хочете знайти всі слова в тексті за вказаним шаблоном без урахування порожніх рядків опустіть символи "< " и «>», для більш точного пошуку лише слів використовуйте ключ -w.

Щоб подібним чином знайти слова, у яких між «c» і «h» може бути будь-яке число символів, використовуйте зірочку (*). У наведеному нижче прикладі із системного словника вибираються всі слова, що починаються з «c» і закінчуються символом «h»:

# grep " /usr/share/dict/words caliph cash catch cheesecloth cheetah --output omitted--

Якщо ви хочете знайти у файлі або вихідному потоці літеральний символ «зірочка», використовуйте одинарні лапки. Користувач у наведеному нижче прикладі спочатку намагається у файлі /etc/profile знайти "зірочку" без використання лапок, внаслідок чого нічого не знаходиться. Коли використовуються лапки, у вихідний потік видається результат:

# grep * /etc/profile # grep "*" /etc/profile for i in /etc/profile.d/*.sh; do

Про цього самовчителя

Ласкаво просимо в «Ази адміністрування», друге з чотирьох посібників, розроблених, щоб підготувати вас до іспиту 101 в Linux Professional Institute. У цій частині ми розглянемо використання регулярних виразів для пошуку тексту у файлах за шаблонами. Потім ви познайомитеся зі «Стандартом ієрархії файлової системи» (Filesystem Hierarchy Standard або скор. FHS), також ми покажемо вам як знаходити потрібні файли у вашій системі. Після чого, ви дізнаєтеся як отримати повний контроль над процесами в Linux, запускаючи їх у фоновому режимі, переглядаючи список процесів, від'єднуючи їх від терміналу та багато іншого. Далі піде швидке введення в конвеєри, перенаправлення та команди обробки тексту. І, нарешті, ми познайомимо вас з модулями ядра Linux.

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



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

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

Що таке «регулярний вираз»?

Регулярне вираз (по англ. regular expression, скор. «regexp» або «regex», на батьківщині іноді називається «регулярка» - прим. пер.) - це особливий синтаксис, що використовується для опису текстових шаблонів. У Linux-системах регулярні висловлювання широко використовуються для пошуку в тексті за шаблоном, а також для пошуку та заміни на текстових потоках.

У порівнянні з глобінгом

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

Просте підрядження

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

$ grep bash /etc/passwd
operator:x:11:0:operator:/root:/bin/bash root:x:0:0::/root:/bin/bash ftp:x:40:1::/home/ftp:/bin/ bash

Вище перший параметр для grep, це regex; другий – ім'я файлу. grep зчитував кожний рядок з /etc/passwdі прикладав на неї просте regex-підрядок «bash» у пошуках збігу. Якщо збіг виявлялося, то grep виводив весь рядок цілком; в іншому випадку рядок ігнорувався.

Розуміння простого підрядку

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

  • /tmp (пошук рядка /tmp)
  • "\" (пошук рядка)
  • "\*funny\*" (пошук рядка *funny*)
  • "ld\.so" (пошук рядка ld.so)

Метасимволи

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

$ grep dev.sda /etc/fstab
/dev/sda3 / reiserfs noatime,ro 1 1 /dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 swap swap sw 0 0 #/dev/sda4 /mnt/extra reiserfs noatime,rw 1

У цьому прикладі текст dev.sda не з'являється буквально в жодній з рядків з /etc/fstab. Однак, grep сканує його не буквально за рядком dev.sda, а за шаблоном dev.sda. Запам'ятайте, що "." буде відповідати будь-якому одиничному символу. Як ви бачите, метасимвол "." функціонально еквівалентний тому, як працює метасимвол "?" у glob-підстановках.

Використання

Якщо ми хочемо задати символ конкретніше, ніж це робить ".", то можемо використовувати [і] (квадратні дужки), щоб вказати підмножину символів для порівняння:

$ grep dev.sda /etc/fstab
/dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 swap swap sw 0 0

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

Використання [^]

Ви можете звернути значення квадратних дужок помістивши ^ одразу після [. У цьому випадку дужки відповідатимуть будь-якому символу, який не перерахований всередині них. І знову, зауважте, що [^] ми використовуємо з регулярними виразами, а [!] з glob:

$ grep dev.hda[^12] /etc/fstab
/dev/hda3 / reiserfs noatime,ro 1 1 #/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1

Відмінний синтаксис

Дуже важливо відзначити, що синтаксис усередині квадратних дужок докорінно відрізняється від решти регулярного виразу. Наприклад, якщо ви помістите "." всередину квадратних дужок, це дозволить квадратним дужкам збігатися з "." буквально, як і 1 і 2 у прикладі вище. Для порівняння, "." поміщена поза квадратними дужками, буде інтерпретована як метасимвол, якщо не приставити "\". Ми можемо отримати вигоду з даного факту для виведення рядків з /etc/fstab, які містять рядок dev.sda, як він записаний:

$ grep dev[.]sda /etc/fstab

Також, ми могли б набрати:

$ grep "dev\.sda" /etc/fstab

Ці регулярні вирази ймовірно не задовольняють жодному рядку з вашого /etc/fstabфайлу.

Матасимвол *

Деякі метасимволи власними силами не відповідають нічому, але змінюють значення попереднього символу. Один із таких символів, це * (зірочка), який використовується для зіставлення нульового або більшого числа повторень попереднього символу. Зауважте, це означає, що * має інше значення в регулярках, ніж у глоббінгу. Ось кілька прикладів, і зверніть особливу увагу на ті випадки, де зіставлення регулярних виразів відрізняється від glob-підстановок:

  • ab*cзбігається з «abbbbc», але не з «abqc» (у разі glob-підстановки обидві рядки будуть задовольняти шаблону. Ви вже зрозуміли чому?)
  • ab*cзбігається з «abc», але не з «abbqbbc» (знову ж таки, при glob-підстановці, шаблон зіставимо з обома рядками)
  • ab*cзбігається з "ac", але не з "cba" (у разі глоббінгу, ні "ac", ні "cba" не задовольняють шаблону)
  • b*eзбігається з «bqe» та з «be» (glob-підстановці задовольняє «bqe», але не «be»)
  • b*eзбігається з «bccqqe», але не з «bccc» (при глоббінгу шаблон так само збігається з першим, але не з другим)
  • b*eзбігається з "bqqcce", але не з "cqe" (так само і при glob-підстановці)
  • b*eзадовольняє «bbbeee» (але не у разі глоббінгу)
  • .* зіставимо з будь-яким рядком (glob-підстановці задовольняють тільки рядки, що починаються з ".")
  • foo.збігається з будь-яким підрядком, що починається з «foo» (у разі glob-підстановки цей шаблон буде збігатися з рядками, що починаються з чотирьох символів «foo.»)

Отже, повторимо для закріплення: рядок «ac» підходить під регулярний вираз «ab*c» тому, що зірочка також дозволяє повторення попереднього виразу (b) нуль разів. І знову, цінно відзначити собі, що метасимвол * в регулярках інтерпретується зовсім інакше, ніж символ * в glob-основах.

Початок та кінець рядка

Останні метасимволи, що ми детально розглянемо, це ^ і $, які використовуються для зіставлення початку та кінця рядка, відповідно. Скориставшись на початку вашого regex, ви «прикріпите» ваш шаблон до початку рядка. У наступному прикладі ми використовуємо регулярний вираз ^#, який задовольняє будь-якому рядку, що починається з символу #:

$ grep ^# /etc/fstab

#

Повнорядне регулювання

^ і $ можна комбінувати, для порівнянь з усім рядком цілком. Наприклад, нижченаведене регулювання буде відповідати рядкам, що починаються з символу #, а символом ".", що закінчується, при довільній кількості символів між ними:

$ grep "^#.*\.$" /etc/fstab
# /etc/fstab: static file system information.

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

Про авторів

Daniel Robbins

Деніель Роббінс - засновник спільноти Gentoo та творець операційної системи Gentoo Linux. Деніель проживає в Нью-Мехіко зі своєю дружиною Мері та двома енергійними дочками. Він також засновник і глава Funtoo, написав безліч технічних статей для IBM developerWorks, Intel Developer Services та C/C++ Users Journal.

Chris Houser

Кріс Хаусер був прихильником UNIX з 1994 року, коли приєднався до команди адміністраторів університету Тейлора (Індіана, США), де здобув ступінь бакалавра у комп'ютерних науках та математиці. Після цього він працював у багатьох областях, включаючи веб-додатки, редагування відео, драйвера для UNIX і криптографічний захист. На даний момент працює в Sentry Data Systems. Кріс також зробив внесок у безліч вільних проектів, таких як Gentoo Linux та Clojure, став співавтором книги The Joy of Clojure.

Aron Griffis

Ейрон Гріффіс живе на території Бостона, де провів останнє десятиліття працюючи в Hewlett-Packard над такими проектами, як мережеві UNIX-драйвера для Tru64, сертифікація безпеки Linux, Xen і KVM віртуалізація, і останнє - платформа HP ePrint. У вільний від програмування час Ейрон вважає за краще роздумувати над проблемами програмування катаючись на своєму велосипеді, жонглюючи бітами, або вболіваючи за бостонську професійну бейсбольну команду «Червоні Шкарпетки».