3.2 Урок 2
Сертифікат: |
Linux Essentials |
---|---|
Версія: |
1.6 |
Розділ: |
3 Потужність командного рядку |
Тема: |
3.2 Пошук та отримання даних з файлів |
Урок: |
2 з 2 |
Вступ
У цьому уроці ми розглянемо інструменти, які використовуються для обробки тексту. Ці інструменти часто використовуються системними адміністраторами або програмами для автоматичного моніторингу або визначення певної повторюваної інформації.
Пошук у файлах за допомогою grep
Першим інструментом, який ми обговоримо на цьому уроці, є команда grep
. grep
є абревіатурою фрази “global regular expression print” (шукати скрізь рядки, які відповідають регулярному виразу, і виводити їх), і його основна функціональність полягає в пошуку в файлах за зазначеним шаблоном. Команда виводить рядок, що містить вказаний шаблон, який виділений червоним кольором.
$ grep bash /etc/passwd root:x:0:0:root:/root:/bin/bash user:x:1001:1001:User,,,,:/home/user:/bin/bash
grep
, як і більшість команд, також можна налаштувати за допомогою параметрів. Ось найпоширеніші з них:
-i
-
пошук не чутливий до регістру
-r
-
рекурсивний пошук (здійснюється пошук всіх файлів в даному каталозі та його підкаталогах)
-c
-
пошук підраховує кількість збігів
-v
-
інвертування збігу, щоб надрукувати рядки, які не відповідають пошуковому шаблону
-E
-
вмикає розширені регулярні вирази (потрібні деяким більш просунутим метасимволам, таким як
|
,+
і?
)
grep
має багато інших корисних опцій. Зверніться до man-сторінки, щоб дізнатися більше про це.
Регулярні вирази
Другий інструмент дуже потужний. Він використовується для опису фрагментів тексту у файлах, які також називають регулярними виразами. Регулярні вирази надзвичайно корисні для отримання даних із текстових файлів шляхом побудови шаблонів. Вони зазвичай використовуються в сценаріях або під час програмування мовами високого рівня, такими як Perl або Python.
Працюючи з регулярними виразами, дуже важливо мати на увазі, що кожен символ має значення і шаблон записується з метою відповідності певній послідовності символів, відомій як рядок. Більшість шаблонів використовує звичайні символи ASCII, такі як літери, цифри, розділові знаки або інші символи, але також можуть використовувати симовли Unicode, щоб відповідати будь-якому іншому типу тексту.
Наступний перелік пояснює метасимволи регулярних виразів, які використовуються для формування шаблонів.
.
-
Відповідність будь-якому окремому символу (крім нового рядка)
[abcABC]
-
Відповідність будь-якому символу в дужках
[^abcABC]
-
Відповідність будь-якому символу, крім символів у дужках
[a-z]
-
Відповідність будь-якому символу в діапазоні
[^a-z]
-
Відповідність будь-якому символу, крім символів у діапазоні
sun|moon
-
Пошук будь-якого із перерахованих рядків
^
-
Початок рядка
$
-
Кінець рядка
Всі функції регулярних виразів також можуть бути реалізовані за допомогою grep
. Ви можете побачити, що у наведеному вище прикладі слово не береться в лапки. Щоб оболонка не інтерпретувала сам метасимвол, рекомендується, більш складні шаблони записувати у подвійних лапках (" "). З метою практики ми будемо використовувати подвійні лапки під час реалізації регулярних виразів. Інші лапки зберігають свою звичайну функціональність, як обговорювалося в попередніх уроках.
Наступні приклади підкреслюють функціональність регулярних виразів. Нам знадобляться дані у файлі, тому наступний набір команд просто додає різні рядки до файлу text.txt
.
$ echo "aaabbb1" > text.txt $ echo "abab2" >> text.txt $ echo "noone2" >> text.txt $ echo "class1" >> text.txt $ echo "alien2" >> text.txt $ cat text.txt aaabbb1 abab2 noone2 class1 alien2
Перший приклад — це комбінація пошуку у файлі без регулярних виразів і з ними. Щоб повністю зрозуміти регулярні вирази, дуже важливо показати різницю. Перша команда шукає точний набір символів у будь-якому місці рядка, тоді як друга команда шукає набори символів, які містять будь-який із символів між дужками. Тому результати команд відрізняються.
$ grep "ab" text.txt aaabbb1 abab2 $ grep "[ab]" text.txt aaabbb1 abab2 class1 alien2
Другий набір прикладів показує застосування метасимволів початку та кінця рядка. Дуже важливо вказати необхідність розміщення цих двох символів у правильному місці у виразі. Коли вказується початок рядка, мета-символ має бути перед виразом, тоді як при вказуванні кінця рядка мета-символ має стояти після виразу.
$ grep "^a" text.txt aaabbb1 abab2 alien2 $ grep "2$" text.txt abab2 noone2 alien2
На додаток до розглянутих раніше мета-символів, регулярні вирази також мають мета-символи, які дозволяють множити попередньо вказаний шаблон:
*
-
Нуль або більше входжень попереднього шаблону
+
-
Одне або кілька входжень попереднього шаблону
?
-
Нуль або одне входження попереднього шаблону
Для метасимволів множника наведена нижче команда шукає рядок, який містить ab
, один символ і один або більше символів, знайдених раніше. Результат показує, що grep
знайшов рядок aaabbb1
, що відповідає частині abbb
, а також abab2
. Оскільки символ +
є символом розширеного регулярного виразу, нам потрібно передати параметр -E
команді grep
.
$ grep -E "ab.+" text.txt aaabbb1 abab2
Більшість метасимволів зрозумілі самі собою, але вони можуть бути складними при першому використанні. Попередні приклади представляють невелику частину функціональних можливостей регулярних виразів. Спробуйте всі метасимволи з наведеної вище таблиці, щоб краще зрозуміти, як вони працюють.
Вправи до посібника
Використовуючи grep
і файл /usr/share/hunspell/en_US.dic
, знайдіть рядки, які відповідають наступним критеріям:
-
Усі рядки, що містять слово
cat
у будь-якому місці рядка. -
Усі рядки, які не містять жодного з наступних символів:
sawgtfixk
. -
Усі рядки, які починаються з будь-яких 3 літер і слова
dig
. -
Усі рядки, які закінчуються принаймні на одну літеру
e
. -
Усі рядки, які містять одне з таких слів:
org
,kay
абоtuna
. -
Кількість рядків, які починаються з однієї
c
або без неї, за якою слідує рядокati
.
Дослідницькі вправи
-
Знайдіть регулярний вираз, який відповідає словам у рядку “Include” і не відповідає словам у рядку “Exclude”:
-
Include:
pot
,spot
,apot
Exclude:
potic
,spots
,potatoe
-
Include:
arp99
,apple
,zipper
Exclude:
zoo
,arive
,attack
-
Include:
arcane
,capper
,zoology
Exclude:
air
,coper
,zoloc
-
Include:
0th/pt
,3th/tc
,9th/pt
Exclude:
0/nm
,3/nm
,9/nm
-
Include:
Hawaii
,Dario
,Ramiro
Exclude:
hawaii
,Ian
,Alice
-
-
Яка ще корисна команда зазвичай використовується для пошуку у файлах? Які додаткові функції вона має?
-
Згадуючи попередній урок, скористайтеся одним із прикладів і спробуйте знайти певний шаблон у виведенні команди за допомогою
grep
.
Підсумки
У цій лабораторній роботі ви дізналися про:
-
Метасимволи регулярних виразів.
-
Як створити шаблони за допомогою регулярних виразів.
-
Як виконувати пошук у файлах.
Команди, які використовуються у вправах:
grep
-
Пошук символів або рядків у файлі.
Відповіді до вправ посібника
Використовуючи grep
і файл /usr/share/hunspell/en_US.dic
, знайдіть рядки, які відповідають наступним критеріям:
-
Усі рядки, що містять слово
cat
у будь-якому місці рядка.$ grep "cat" /usr/share/hunspell/en_US.dic Alcatraz/M Decatur/M Hecate/M ...
-
Усі рядки, які не містять жодного з наступних символів:
sawgtfixk
.$ grep -v "[sawgtfixk]" /usr/share/hunspell/en_US.dic 49269 0/nm 1/n1 2/nm 2nd/p 3/nm 3rd/p 4/nm 5/nm 6/nm 7/nm 8/nm ...
-
Усі рядки, які починаються з будь-яких 3 літер і слова
dig
.$ grep "^...dig" /usr/share/hunspell/en_US.dic cardigan/SM condign predigest/GDS ...
-
Усі рядки, які закінчуються принаймні на одну літеру
e
.$ grep -E "e+$" /usr/share/hunspell/en_US.dic Anglicize Anglophobe Anthropocene ...
-
Усі рядки, які містять одне з таких слів:
org
,kay
абоtuna
.$ grep -E "org|kay|tuna" /usr/share/hunspell/en_US.dic Borg/SM George/MS Tokay/M fortunate/UY ...
-
Кількість рядків, які починаються з однієї
c
або без неї, за якою слідує рядокati
.$ grep -cE "^c?ati" /usr/share/hunspell/en_US.dic 3
Відповіді до дослідницьких вправ
-
Знайдіть регулярний вираз, який відповідає словам у рядку “Include” і не відповідає словам у рядку “Exclude”:
-
Include:
pot
,spot
,apot
Exclude:
potic
,spots
,potatoe
Answer:
pot$
-
Include:
arp99
,apple
,zipper
Exclude:
zoo
,arive
,attack
Answer:
p+
-
Include:
arcane
,capper
,zoology
Exclude:
air
,coper
,zoloc
Answer:
arc|cap|zoo
-
Include:
0th/pt
,3th/tc
,9th/pt
Exclude:
0/nm
,3/nm
,9/nm
Answer:
[0-9]th.+
-
Include:
Hawaii
,Dario
,Ramiro
Exclude:
hawaii
,Ian
,Alice
Answer:
^[A-Z]a.*i+
-
-
Яка ще корисна команда зазвичай використовується для пошуку у файлах? Які додаткові функції вона має?
Команда
sed
. Ця команда може знаходити та замінювати символи або набори символів у файлі. -
Згадуючи попередній урок, скористайтеся одним із прикладів і спробуйте знайти певний шаблон у виведенні команди за допомогою
grep
.Я взяв одну з відповідей із дослідницьких вправ і шукав рядок, який має такі дозволи групи як читання, запис і виконання. Ваша відповідь може відрізнятися, залежно від вибраної команди та створеного шаблону.
$ cat contents.txt | tr -s " " | grep "^....rwx"
Ця вправа покаже вам, що
grep
також може отримувати вхідні дані від різних команд і може допомогти у фільтрації згенерованої інформації.