Як їх ефективно використовувати?

Якщо ви деякий час користуєтеся Linux, ви вже знаєте про grep — Global Regular Expression Print, інструмент для обробки тексту, який можна використовувати для пошуку файлів і каталогів. Це дуже корисно в руках досвідченого користувача Linux. Однак використання без регулярного виразу може обмежити його можливості.

Але що таке Regex?

Regex — це регулярні вирази, які можна використовувати для покращення функціональності пошуку grep. Regex, за визначенням, є вдосконаленим шаблоном фільтрації виводу. Потренувавшись, ви зможете ефективно використовувати регулярний вираз, оскільки ви також можете використовувати його з іншими командами Linux.

У нашому посібнику ми навчимося ефективно використовувати Grep і Regex.

Попередня умова

Використання grep із регулярним виразом вимагає хороших знань Linux. Якщо ви новачок, перегляньте наші посібники з Linux.

Вам також потрібен доступ до ноутбука або комп’ютера з операційною системою Linux. Ви можете використовувати будь-який дистрибутив Linux на свій вибір. І, якщо у вас є машина з Windows, ви все ще можете використовувати Linux з WSL2. Перегляньте наш детальний погляд на це тут.

Доступ до командного рядка/терміналу дозволяє запускати всі команди, надані в нашому підручнику grep/regex.

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

«Створіть 400 слів про техніку. Він повинен містити більшість технологій. Також переконайтеся, що ви повторюєте назви технологій у тексті».

Коли він створив текст, я скопіював його та зберіг у файлі tech.txt, який ми будемо використовувати протягом усього підручника.

Нарешті, базове розуміння команди grep є обов’язковим. Ви можете переглянути 16 прикладів команд grep, щоб оновити свої знання. Ми також коротко представимо команду grep, щоб ви могли почати.

Синтаксис і приклади команди grep

Синтаксис команди grep простий.

$ grep -options [regex/pattern] [files]

Як ви можете помітити, він очікує шаблон і список файлів, які ви хочете виконати команду.

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

  • – i: ігнорувати регістри
  • -r: виконувати рекурсивний пошук
  • -w: виконати пошук, щоб знайти лише цілі слова
  • -v: відобразити всі невідповідні рядки
  • -n: відобразити всі відповідні номери рядків
  • -l: вивести імена файлів
  • –колір: виведення кольорового результату
  • -c: показує кількість збігів для використаного шаблону

#1. Пошук цілого слова

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

$ grep -w ‘tech\|5G’ tech.txt

Як бачите, результатом виконання команди є пошук за двома словами «5G» і «tech» у всьому тексті. Потім він позначає їх червоним кольором.

Тут | Символ труби екранується, щоб grep не обробляв його як метасимвол.

Щоб виконати пошук без урахування регістру, використовуйте grep з аргументом -i.

$ grep -i ‘tech’ tech.txt

Команда шукає будь-який екземпляр рядка «tech» без урахування регістру, будь то повне слово або його частина.

Щоб відобразити всі рядки, які не містять заданий шаблон, вам потрібно буде використати аргумент -v.

$ grep -v ‘tech’ tech.txt

Результат показує всі рядки, які не містять слова «tech». Також ви побачите порожні рядки. Ці рядки є рядками після абзацу.

Щоб виконати рекурсивний пошук, використовуйте аргумент -r із командою grep.

$ grep -R ‘error\|warning’ /var/log/*.log
#output

/var/log/bootstrap.log:2023-01-03 21:40:18 URL:http://ftpmaster.internal/ubuntu/pool/main/libg/libgpg-error/libgpg-erro 0_1.43-3_amd64.deb [69684/69684] -> "/build/chroot//var/cache/apt/archives/partial/libgpg-error0_1.43-3_amd64.deb" [1]

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: ignoring pre-dependency problem!

Команда grep рекурсивно шукає два слова, «помилка» та «попередження», у каталозі /var/log. Це зручна команда, щоб дізнатися про будь-які попередження та помилки у файлах журналу.

Grep і Regex: що це таке та приклади

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

  • Основні регулярні вирази (BRE)
  • Розширені регулярні вирази (ERE)
  • Pearl-сумісні регулярні вирази (PCRE)

Команда grep використовує BRE як параметр за замовчуванням. Отже, якщо ви хочете використовувати інші режими регулярних виразів, вам потрібно згадати їх. Команда grep також розглядає метасимволи як вони є. Отже, якщо ви використовуєте такі метасимволи, як ?, +, ), вам потрібно буде екранувати їх за допомогою команди зворотної косої риски (\).

Синтаксис grep із регулярним виразом наведено нижче.

$ grep [regex] [filenames]

Давайте подивимося на дію grep і regex на прикладах нижче.

#1. Збіги буквальних слів

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

$ grep "technologies" tech.txt

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

$ grep bash /etc/passwd
#output

root:x:0:0:root:/root:/bin/bash

nitt:x:1000:1000:,,,:/home/nitt:/bin/bash

Це відображає користувачів, які можуть отримати доступ до bash.

#2. Зіставлення прив’язки

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

  • Символ каретки «^»: символ каретки відповідає початку рядка або рядка введення та шукає порожній рядок.
  • Символ долара «$»: символ долара відповідає кінці рядка або рядка введення та шукає порожній рядок.

Інші два символи прив’язки включають межу слова «\ b» і межу слова «\ B».

  • Межа слова ‘\ b’: за допомогою \b ви можете встановити позицію між словом і символом, що не є словом. Простими словами, це дозволяє вам зіставляти цілі слова. Таким чином можна уникнути часткових збігів. Ви також можете використовувати його для заміни слів або підрахунку входжень слів у рядку.
  • Межа \B без слова: це протилежність межі слова \b у регулярному виразі, оскільки вона стверджує позицію, яка не знаходиться між символами з двох слів або без слів.

Давайте розглянемо приклади, щоб отримати чітке уявлення.

$ grep ‘^From’ tech.txt

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

$ grep ‘^from’ tech.txt

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

$ grep ‘technology.$' tech.txt

Ви також можете комбінувати символи ^ і $. Давайте розглянемо приклад нижче.

$ grep “^From \| technology.$” tech.txt

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

#3. Групування

Якщо ви хочете шукати кілька шаблонів одночасно, вам потрібно буде використовувати групування. Це допомагає вам створювати невеликі групи символів і шаблонів, які можна розглядати як єдине ціле. Наприклад, ви можете створити групу (tech), яка включає термін «t», «e», «c», «h».

Щоб отримати чітке уявлення, розглянемо приклад.

$ grep 'technol\(ogy\)\?' tech.txt

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

Альтернативний пошук із групуванням

Розглянемо приклад альтернативного пошуку.

$ grep "\(tech\|technology\)" tech.txt

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

$ echo “tech technological technologies technical” |  grep "\(tech\|technology\)"
#output

“tech technological technologies technical”

Групи захоплення, групи без захоплення та повторювані шаблони

А як щодо захоплених і не захоплених груп?

Вам потрібно буде створити групу в регулярному виразі та передати її в рядок або файл для захоплення груп.

$ echo 'tech655 tech655nical technologies655 tech655-oriented 655' | grep "\(tech\)\(655\)"
#output

tech655 tech655nical technologies655 tech655-oriented 655

А для груп, які не перехоплюють, вам потрібно буде використовувати ?: у дужках.

Нарешті, ми маємо повторювані шаблони. Вам потрібно буде змінити регулярний вираз, щоб перевірити повторювані шаблони.

$ echo ‘teach tech ttrial tttechno attest’ | grep '\(t\+\)'
#output

‘teach tech ttrial tttechno attest’

Тут регулярний вираз шукає один або більше випадків символу “t”.

#4. Класи персонажів

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

  • [:digit:] – від 0 до 9 цифр
  • [:alpha:] – букви
  • [:alnum:] – буквено-цифрові символи
  • [:lower:] – букви нижнього регістру
  • [:upper:] – великі літери
  • [:xdigit:] – шістнадцяткові цифри, включаючи 0-9, AF, af
  • [:blank:] – пробіли, такі як табуляція або пробіл

І так далі!

Давайте перевіримо деякі з них у дії.

$ grep [[:digit]] tech.txt

$ grep [[:alpha:]] tech.txt

$ grep [[:xdigit:]] tech.txt

#5. Квантори

Квантори є метасимволами і є основою регулярного виразу. Це дає змогу точно зіставляти зовнішній вигляд. Давайте розглянемо їх нижче.

  • * → Нуль або більше збігів
  • + → один або кілька збігів
  • ? → Нуль або один збігів
  • {x} → x відповідає
  • {x, } → x або більше збігів
  • {x,z} → від x до z відповідає
  • {, z} → до z збігів
$ echo ‘teach tech ttrial tttechno attest’ | grep -E 't+'
#output

‘teach tech ttrial tttechno attest’

Тут він шукає екземпляри символу «t» для одного чи кількох збігів. Тут -E означає розширений регулярний вираз (який ми обговоримо пізніше).

#6. Розширений регулярний вираз

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

$ grep -E 'in+ovation' tech.txt

#7. Використання PCRE для виконання складних пошуків

PCRE (Regular Expression, сумісний з Perl) дозволяє робити набагато більше, ніж просто писати вирази. Наприклад, ви можете написати «\d», що позначає [0-9].

Наприклад, ви можете використовувати PCRE для пошуку адрес електронної пошти.

echo "Contact me at [email protected]" | grep -P "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b"
#output

Contact me at [email protected]

Тут PCRE забезпечує відповідність шаблону. Подібним чином ви також можете використовувати шаблон PCRE для перевірки шаблонів дати.

$ echo "The Sparkain site launched on 2023-07-29" | grep -P "\b\d{4}-\d{2}-\d{2}\b"
#output

The Sparkain site launched on 2023-07-29

Команда знаходить дату у форматі РРРР-ММ-ДД. Ви можете змінити його, щоб відповідати іншому формату дати.

#8. Чергування

Якщо вам потрібні альтернативні збіги, ви можете використовувати символи вертикальної лінії (\|).

$ grep -L ‘warning\|error’ /var/log/*.log
#output

/var/log/alternatives.log

/var/log/bootstrap.log

/var/log/dpkg.log

/var/log/fontconfig.log

/var/log/ubuntu-advantage.log

/var/log/upgrade-policy-changed.log

Вихід містить список імен файлів, які містять «попередження» або «помилка».

Заключні слова

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

Далі перегляньте поширені питання та відповіді на інтерв’ю щодо Linux.