- Серія контенту:
- Цей контент є частиною серії: Вивчаємо Linux, 101
- Короткий огляд
- попередні вимоги
- Підготовка до виконання прикладів
- Лістинг 1. Створення файлів, необхідних для прикладів цієї статті
- Listing 2. Creating the example files - output
- Пошук в файлах і файлових системах
- Лістинг 3. Прості регулярні вирази
- деякі скорочення
- Лістинг 4. Інші регулярні вирази
- Відповідність початку або кінця рядка
- Більш складні вирази
- Лістинг 5. Круглі дужки і класи символів
- Лістинг 6. Інші класи символів
- Які збіги були знайдені?
- Малюнок 1. Використання кольору для збігів grep
- Розширена форма регулярних виразів
- Лістинг 7. Розширені регулярні вирази
- Пошук в файлах
- Лістінг 8. ЗАСТОСУВАННЯ grep до декількох файлів
- Лістинг 9. Пошук файлів, що містять, як мінімум, одне слово banana
- Лістинг 10. Вміст файлів text1, text2 і text3
- Лістинг 11. Пошук з використанням grep і sed
- Лістинг 12. Видалення нумерації рядків за допомогою sed
- Лістинг 13. Остаточний список фруктів
- Лістинг 14. Використання розширеної форми синтаксису регулярних виразів в sed
- Ресурси для скачування
Вивчаємо Linux, 101
Як знайти голку в стозі сіна
Серія контенту:
Цей контент є частиною # з серії # статей: Вивчаємо Linux, 101
https://www.ibm.com/developerworks/ru/views/global/libraryview.jsp?series_title_by=Изучаем+linux,+101
Слідкуйте за виходом нових статей цієї серії.
Цей контент є частиною серії: Вивчаємо Linux, 101
Слідкуйте за виходом нових статей цієї серії.
Короткий огляд
З цієї статті ви дізнаєтеся про основні прийоми пошуку тексту в текстових файлах з використанням регулярних виразів в Linux. Ви навчитеся:
- Будувати прості регулярні вирази.
- Виконувати пошук в файлах і файлової системи з використанням регулярних виразів.
- Використовувати регулярні вирази спільно з sed.
Ця стаття допоможе вам підготуватися до здачі іспиту LPI 101 на адміністратора початкового рівня (LPIC-1) і містить матеріали мети 103.7 теми 103. Мета має вагу 2.
попередні вимоги
Щоб отримати найбільшу користь з наших статей, необхідно володіти базовими знаннями про Linux і мати працездатний комп'ютер з Linux, на якому можна буде виконувати всі зустрічаються команди. Іноді різні версії програм виводять результати по-різному, тому вміст лістингів і малюнків може відрізнятися від того, що ви побачите на вашому комп'ютері. В основі цієї статті лежить концепція, описана в одній з попередніх статей цієї серії " Вивчаємо Linux 101: текстові потоки і фільтри ".
Підготовка до виконання прикладів
Зв'язок з Яном
Ян - один з наших найбільш популярних і плідних авторів. ознайомтеся зі всіма статтями Яна (EN), опублікованими на сайті developerWorks. Ви можете знайти контактні дані в профілі Яна і зв'язатися з ним, а також з іншими авторами та учасниками ресурсу My developerWorks.
Для виконання прикладів в цій статті ми будемо використовувати деякі файли, створені раніше в статті " Вивчаємо Linux, 101: текстові потоки і фільтри ". Якщо ви не читали цю статтю або не берегли файли, не турбуйтеся! Давайте почнемо з створення нової директорії lpi103-7 і всіх необхідних файлів. Для цього відкрийте текстове вікно і перейдіть в вашу домашню директорію. Скопіюйте вміст лістингу 1 в текстове вікно; в результаті виконання команд у вашій домашній директорії буде створена піддиректорія lpi103-7 і в ній всі необхідні файли, які ми і будемо використовувати в наших прикладах.
Лістинг 1. Створення файлів, необхідних для прикладів цієї статті
mkdir -p lpi103-7 && cd lpi103-7 && {echo -e "1 apple \ n2 pear \ n3 banana"> text1 echo -e "9 \ tplum \ n3 \ tbanana \ n10 \ tapple"> text2 echo "This is a sentence. "! #: *! #: 1-> text3 split -l 2 text1 split -b 17 text2 y; cp text1 text1.bkp mkdir -p backup cp text1 backup / text1.bkp.2}
Ваше вікно повинно виглядати так, як показано в лістингу 2, а вашої поточної робочої Директорією повинна стати новостворена директорія lpi103-7.
Listing 2. Creating the example files - output
ian @ attic4: ~ $ mkdir -p lpi103-7 && cd lpi103-7 && {> echo -e "1 apple \ n2 pear \ n3 banana"> text1> echo -e "9 \ tplum \ n3 \ tbanana \ n10 \ tapple "> text2> echo" This is a sentence. "! #: *! #: 1-> text3 echo" This is a sentence. "" This is a sentence. "" This is a sentence. "> text3> split -l 2 text1> split -b 17 text2 y; > Cp text1 text1.bkp> mkdir -p backup> cp text1 backup / text1.bkp.2>} ian @ attic4: ~ / lpi103-7 $
Регулярні вирази сягають своїм корінням в теорію мов програмування. Більшість студентів, які вивчають комп'ютерні науки, знають, що мови, які визначаються регулярними виразами, в точності такі ж, що і мови, що приймаються кінцевими автоматами. Регулярні вирази, які будуть розглянуті нами в цій статті, можуть бути набагато складнішими і не є тими ж самими виразами, які ви могли вивчати на заняттях з інформатики, хоча між ними простежується певна схожість.
Регулярний вираз (інша його назва - "regex" або "regexp") є способом опису текстового рядка або шаблону, що дозволяє програмам знаходити відповідність шаблону в довільних текстових рядках і забезпечує виключно потужні можливості пошуку. Команда grep (акронім від g eneralized r egular e xpression p rocessor) є стандартним інструментом будь-якого розробника або адміністратора Linux або UNIX® і дозволяє використовувати регулярні вирази для пошуку в файлах або виведення команд. У статті " Вивчаємо Linux, 101: текстові потоки і фільтри "Ми розповіли про sed - потоковому редакторі, який є ще одним стандартним інструментом, який активно використовує регулярні вирази для пошуку і заміни тексту в файлах або текстових потоках. Ця стаття допоможе вам краще розібратися з регулярними виразами, з якими працюють команди grep і sed. Ще однією програмою, в якій широко застосовуються регулярні вирази, є програма awk.
Існує безліч книг, присвячених регулярними виразами і теорії мов програмування. В розділі ресурси ви можете знайти посилання на деякі з них.
Коли ви дізнаєтеся про регулярні вирази, то ви побачите схожість між їх синтаксисом і метасимвол (або підстановкою імен), які розглядаються в іншій статті цієї серії " Вивчаємо Linux, 101: управління файлами і директоріями ". Майте на увазі, що ця подібність лише поверхневе.
У програмі GNU grep, що входить до складу більшості дистрибутивів Linux, використовуються дві форми синтаксису регулярних виразів: основна і розширена. Функціональність GNU grep не залежить від використання тієї чи іншої форми і однакова в обох випадках. У цій статті описується основна форма синтаксису і наводяться її відмінності від розширеної форми.
Регулярні вирази складаються з символів і операторів, що доповнюються метасимвол. Більшість символів відповідають своїм значенням, а більшість метасимволов необхідно відокремлювати символом зворотної косої риски (\). Основними операторами є:
Конкатенація
В результаті конкатенації (об'єднання) двох регулярних виразів ми отримуємо більш довге вираження. Наприклад, в рядку abcdcba для регулярного виразу a буде знайдено два відповідності (перший і останній символи a); так само справа йде і з виразом b. Однак для регулярного виразу ab буде знайдено тільки одне відповідність ab cdcba, а для вираження ba - тільки відповідність abcdc ba. Повторення Оператор Кліні *, або оператор повторення відповідає попередньому регулярному виразу, що повторюється 0 або більше разів. Так, регулярному виразу a * b буде відповідати будь-який рядок, що містить будь-яку кількість символів a і закінчується символом b, в тому числі рядок, що містить один тільки символ b. Оператор Кліні * не потрібно записувати у вигляді escape-послідовності, тому якщо ви хочете знайти в вираженні буквене значення символу зірочки (*), то цей символ повинен бути записаний у вигляді escape-послідовності. Використання символу * в даному випадку відрізняється від його використання при підстановці імен, в якій він відповідає будь-якому рядку. Чергування Оператор чергування (|) визначає відповідність або для попереднього, або для подальшого вираження. При використанні основного синтаксису він повинен бути записаний у вигляді escape-послідовності. Так, регулярному виразу a * \ | b * c буде відповідати будь-який рядок, що містить будь-яку кількість символів a або b (але не обох одночасно) і закінчується символом c, в тому числі рядок, що містить один тільки символ c.
Щоб регулярні вирази не оброблялися командним інтерпретатором, часто їх необхідно брати в лапки.
Пошук в файлах і файлових системах
У цій статті ми будемо використовувати текстові файли, створені нами раніше (див. Розділ Підготовка до виконання прикладів ). Вивчіть прості приклади, наведені в лістингу 3. Зверніть увагу на те, що команда grep приймає регулярний вираз в якості обов'язкового параметра і список з 0 або більше файлів, в яких слід шукати заданий вираз. Якщо файли не вказані, то команда grep виконує пошук в потоці stdin, завдяки чому, її можна використовувати в конвеєрах як фільтр. Якщо збігів, не знайдено, то grep не виводить ніяких результатів, однак ви завжди можете перевірити код завершення.
Лістинг 3. Прості регулярні вирази
ian @ attic4: ~ / lpi103-7 $ grep p text1 1 apple 2 pear ian @ attic4: ~ / lpi103-7 $ grep pea text1 2 pear ian @ attic4: ~ / lpi103-7 $ grep "p *" text1 1 apple 2 pear 3 banana ian @ attic4: ~ / lpi103-7 $ grep "pp *" text1 1 apple 2 pear ian @ attic4: ~ / lpi103-7 $ grep "x" text1; echo $? 1 ian @ attic4: ~ / lpi103-7 $ grep "x *" text1; echo $? 1 apple 2 pear 3 banana 0 ian @ attic4: ~ / lpi103-7 $ cat text1 | grep "l \ | n" 1 apple 3 banana ian @ attic4: ~ / lpi103-7 $ echo -e "find an \ ns * here" | grep "s \ *" s * here
Як видно з цих прикладів, іноді можна отримати несподіваний результат, особливо при використанні оператора повторення. Ймовірно, ви припускали, що регулярному виразу p * або, по крайней мере, pp * відповідатимуть рядки з декількох символів p, однак виразами p * і x * відповідають будь-які рядки файлу; це обумовлено тим, що оператор * відповідає попередньому регулярному виразу, що повторюється нуль або більше разів.
У двох прикладах був запитаний код завершення команди grep. Значення 0 говорить про те, що збіг було знайдено, а значення 1 - про те, що збігів знайдено не було. Значення, що перевищує 1 (в GNU grep воно завжди дорівнює 2) повертається в разі виникнення помилки, наприклад, якщо зазначений файл не існує.
деякі скорочення
Тепер, коли ви можете використовувати основні блоки для побудови регулярних виразів в grep, я розповім про деякі зручних скорочення.
+
Оператор + схожий на оператор * за винятком того, що він відповідає попередньому регулярному виразу, що повторюється один або більше разів. При використанні основного синтаксису він повинен бути записаний у вигляді escape-послідовності. ? Символ? означає, що попереднє регулярний вираз є необов'язковим, т. е. він відповідає попередньому регулярному виразу, що повторюється 0 або 1 раз. В даному випадку значення символу? відрізняється від значення відповідного символу, що використовується при підстановці імен. . Символ. (Точка) - це метасимвол, відповідний будь-якому символу. Одним з найбільш поширених шаблонів є вираз. *, Яке відповідає рядку довільної довжини, що містить будь-які символи (або не містить їх взагалі). Не варто говорити про те, що такі конструкції використовуються як частина більш складних виразів. Порівняйте регулярний вираз, що складаються з однієї точки, зі знаком? в підстановці імен, а також регулярний вираз. * з символом * в підстановці імен.
Лістинг 4. Інші регулярні вирази
ian @ attic4: ~ / lpi103-7 $ grep "pp \ +" text1 # at least two p's 1 apple ian @ attic4: ~ / lpi103-7 $ grep "pl \? e" text1 1 apple 2 pear ian @ attic4: ~ / lpi103-7 $ grep "pl \? e" text1 # pe with optional l between 1 apple 2 pear ian @ attic4: ~ / lpi103-7 $ grep "p. * r" text1 # p, some string then r 2 pear ian @ attic4: ~ / lpi103-7 $ grep "a .." text1 # a followed by two other letters 1 apple 3 banana
Відповідність початку або кінця рядка
Символ вставки ^ означає початок рядка, а символ долара $ - кінець рядка. Таким чином, регулярний вираз ^ .. b відповідає двом будь-яким символам на початку рядка, після яких слід символ b, а вираз ar $ - будь-якому рядку, що закінчується на ar. Регулярний вираз ^ $ відповідає порожній рядку.
Більш складні вирази
До сих пір ми застосовували оператор повторення до окремого символу. Якщо вам необхідно знайти всі збіги для рядка з декількох символів, наприклад, знайти всі входження an в слові b anan a, то використовуйте круглі дужки (при використанні основного синтаксису вони повинен бути записані у вигляді escape-послідовностей). Точно так же, може виникнути необхідність знайти кілька символів, не використовуючи такі загальні або довгі конструкції, як. або оператори чергування. В цьому випадку ви можете зробити висновок всіх можливих значення в квадратні дужки ([]), які не потрібно оформляти у вигляді escape-послідовностей для головної форми синтаксису. Вирази в квадратних дужках утворюють клас символів. Квадратні дужки (за винятком окремих випадків, про які буде розказано пізніше) також позбавляють від необхідності використовувати escape-послідовності для спеціальних символів, таких як. і *.
Лістинг 5. Круглі дужки і класи символів
ian @ attic4: ~ / lpi103-7 $ grep "\ (an \) \ +" text1 # find at least 1 an 3 banana ian @ attic4: ~ / lpi103-7 $ grep "an \ (an \) \ +" text1 # find at least 2 an's 3 banana ian @ attic4: ~ / lpi103-7 $ grep "[3p]" text1 # find p or 3 1 apple 2 pear 3 banana ian @ attic4: ~ / lpi103-7 $ echo -e "find an \ ns * here \ nsomewhere." | grep "s [. *]" s * here ian @ attic4: ~ / lpi103-7 $ echo -e "find an \ n * in position 2." | grep ". [. *]" * in position 2.
Існує кілька цікавих можливостей, доступних при роботі з класами символів.
ДіапазонДіапазон - це два символи, розділені дефісом (-), наприклад, 0-9 (десяткові цифри) або 0-9a-fA-F (шістнадцяткові цифри). Зверніть увагу на те, що діапазони залежать від використовуваної локалі. Іменовані класи Існує кілька іменованих класів для зручного позначення широко використовуваних класів. Іменовані класи починаються з [: і закінчуються на:], і можуть бути використані у виразах, вкладених у квадратні дужки. Наведемо кілька прикладів: [: alnum:] Все алфавітно-цифрові символи. [: blank:] Пропуск і символи табуляції. [: digit:] Цифри від 0 до 9 (еквівалентно діапазону 0-9). [: upper:] and [: lower:] Букви в верхньому і нижньому регістрах відповідно. ^ (Заперечення) Якщо клас символів починається з символу вставки ^ (т. Е. Символ ^ варто відразу ж після відкриває квадратної дужки), то регулярному виразу відповідатимуть значення, що містять будь-які символи (за винятком першого символу ^), крім перерахованих в класі після символу ^.
Беручи до уваги все вищесказане, можна зробити наступні висновки: якщо ви хочете знайти збіг з літерним значенням дефіса (-), що міститься в класі символів, то ви повинні поставити його або першим, або останнім; якщо ви хочете знайти буквене значення символу ^, то він не повинен стояти першим; символ] (права квадратна дужка) закриває клас, якщо вона не стоїть першою.
Класи символів - це єдина область, в якій не існує відмінностей між регулярними символами і підстановкою імен, хоча символи заперечення все-таки різняться (^ і!). У лістингу 6 наведені деякі приклади роботи з класами символів.
Лістинг 6. Інші класи символів
ian @ attic4: ~ / lpi103-7 $ # Match on range 3 through 7 ian @ attic4: ~ / lpi103-7 $ echo -e "123 \ n456 \ n789 \ n0" | grep "[3-7]" 123 456 789 ian @ attic4: ~ / lpi103-7 $ # Find digit followed by no n or r till end of line ian @ attic4: ~ / lpi103-7 $ grep "[[: digit :]] [^ nr] * $ "text1 1 apple ian @ attic4: ~ / lpi103-7 $ # Find a digit, n, or z followed by no n or r till end of line ian @ attic4: ~ / lpi103- 7 $ grep "[[: digit:] nz] [^ nr] * $" text1 1 apple 3 banana
Вас не здивував останній приклад? У цьому випадку перший вираз в квадратних дужках відповідає будь цифрі або буквах n або z в рядку, і після останньої літери n не слід інша буква n або r, тому завершальна подстрока na відповідає регулярному виразу.
Які збіги були знайдені?
Ви можете задати значення змінної оточення GREP_COLORS для виділення кольором запропонованих варіантів. При використанні значення за замовчуванням знайдені збіги виділяються червоним жирним шрифтом, як показано на малюнку 1. З цього малюнка видно, що з регулярним виразом збіглася вся перший рядок виведення і два останніх символу в другому рядку.
Малюнок 1. Використання кольору для збігів grep
Якщо у вас немає досвіду роботи з регулярними виразами, або ви не можете зрозуміти, чому команда grep повернула ту чи іншу рядок, цей спосіб допоможе вам розібратися.
Розширена форма регулярних виразів
Розширена форма синтаксису регулярних виразів є розширенням GNU. Вона позбавляє від необхідності записувати деякі символи (включаючи круглі дужки, символи '?', '+', '|' І '{') у вигляді escape-послідовностей, як це потрібно для головної форми синтаксису. Зворотний бік полягає в тому, що ви повинні записувати їх у вигляді escape-послідовностей в тих випадках, коли вам потрібно, щоб вони інтерпретувалися в вашому регулярному виразі як звичайні буквені символи. Для вказівки того, що ви використовуєте розширену форму синтаксису регулярних виразів, ви можете використовувати опцію -E (або --extended-regexp) команди grep. Інший спосіб переключитися в розширений режим - використовувати команду egrep. У лістингу 7 наведено приклад, який ми вже бачили в цьому розділі, але в ньому використовується розширена форма синтаксису і команда egrep.
Лістинг 7. Розширені регулярні вирази
ian @ attic4: ~ / lpi103-7 $ # Find b followed by one or more an's and then an a ian @ attic4: ~ / lpi103-7 $ grep "b \ (an \) \ + a" text1 3 banana ian @ attic4: ~ / lpi103-7 $ egrep "b (an) + a" text1 3 banana
Пошук в файлах
Тепер, коли ви знайомі з основними командами, давайте подивимося, як використовувати всю міць команд grep і find для пошуку інформації в файлової системі. У наших простих прикладах ми будемо використовувати файли, створені раніше в статті " Вивчаємо Linux 101: текстові потоки і фільтри "Або в директорії lpi103-7 і її піддиректоріях (див. Розділ Підготовка до виконання прикладів ). У першому випадку у вас будуть додаткові файли, і, відповідно, ви отримаєте додаткові результати.
По-перше, команда grep може виконувати пошук відразу в декількох файлах. Якщо ви додасте опцію -n, то команда покаже вам номери рядків, в яких були знайдені збіги. Якщо ви просто хочете знати кількість рядків з збігами, то використовуйте опцію -c, а якщо вам потрібен список файлів, що містять збіги, використовуйте опцію -l. У лістингу 8 наведено деякі приклади.
Лістінг 8. ЗАСТОСУВАННЯ grep до декількох файлів
ian @ attic4: ~ / lpi103-7 $ grep plum * text2: 9 plum yaa: 9 plum ian @ attic4: ~ / lpi103-7 $ grep -n banana text [1-4] text1: 3: 3 banana text2: 2 : 3 banana ian @ attic4: ~ / lpi103-7 $ grep -c banana text [1-4] text1: 1 text2: 1 text3: 0 ian @ attic4: ~ / lpi103-7 $ grep -l pear * text1 text1. bkp xaa
У прикладі з використанням опції -c в лістингу 8 є рядок text3: 0. Часто може виникати необхідність дізнатися, скільки тих чи інших збігів міститься в файлі, але при цьому не потрібно знати про файлах, в яких цих збігів немає. У команди grep є опція -v, яка відображає висновок тільки для тих рядків, які не містять збігів. Таким чином, можна використовувати регулярний вираз: 0 $ для пошуку рядків, що закінчуються на: 0.
Це ми і зробимо в нашому наступному прикладі, використовуючи команду find для пошуку всіх файлів в поточній директорії і її піддиректоріях і команду xargs для передачі списку файлів команді grep з метою визначення кількості знайдених слів banana в кожному файлі. Нарешті, ми сортуємо отриманий висновок за допомогою додаткового виклику команди grep c опцією -v для пошуку всіх рядків, що не закінчуються на: 0, і отримуємо кількість файлів, що містять слово banana.
Лістинг 9. Пошук файлів, що містять, як мінімум, одне слово banana
ian @ attic4: ~ / lpi103-7 $ find. -type f -print0 | xargs -0 grep -c banana | grep -v ": 0 $" ./backup/text1.bkp.2:1 ./text2:1 ./text1:1 ./yaa:1 ./xab:1 ./text1.bkp:1
У статті " Вивчаємо Linux 101: текстові потоки і фільтри "Ми розповідали про потоковому редакторі sed і згадували про те, що sed використовує регулярні вирази. Регулярні вирази можуть використовуватися як в адресних виразах, так і в виразах заміни.
Якщо ви просто щось шукаєте, то, ймовірно, вам підійде команда grep. Якщо ж вам необхідно витягти рядок пошуку (або пов'язану з нею рядок) зі списку всіх знайдених рядків для подальшої обробки, то для цього можна використовувати редактор sed. Отже, давайте з'ясуємо, як це працює. Для початку нагадаємо вам, що наші файли text1 і text2 містили номери і імена фруктів, розділені пробілами і табуляцією, а файл text3 - повторюване пропозицію. Вміст цих трьох файлів представлено в лістингу 10.
Лістинг 10. Вміст файлів text1, text2 і text3
ian @ attic4: ~ / lpi103-7 $ cat text [1-3] 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple This is a sentence. This is a sentence. This is a sentence.
Спочатку ми використовуємо команди grep і sed для вилучення рядків, що починаються з однієї або декількох цифр, після яких слід символ-роздільник (пробіл або табуляція). У звичайному режимі sed виводить всі рядки, тому ми використовуємо його опцію -n, щоб уникнути цього, а потім використовуємо команду p редактора sed для виведення тільки тих рядків, які відповідають нашому регулярному виразу. Щоб бути впевненими, що ми використовуємо в обох випадках один і той же регулярний вираз, ми присвоїли його змінної.
Лістинг 11. Пошук з використанням grep і sed
ian @ attic4: ~ / lpi103-7 $ grep "$ oursearch" text [1-3] text1: 1 apple text1: 2 pear text1: 3 banana text2: 9 plum text2: 3 banana text2: 10 apple ian @ attic4: ~ / lpi103-7 $ cat text [1-3] | sed -ne "/ $ oursearch / p" 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple
Зауважимо, що команда grep відображає імена файлів тільки в тих випадках, коли пошук виконується в декількох файлах. Оскільки для передачі вхідних даних редактору sed ми використовували команду cat, то sed нічого не знає про імена вихідних файлів. Проте, збіги рядків ідентичні в обох випадках, як ми і очікували.
Тепер припустимо, що нас цікавить тільки перше слово з кожної знайденої рядки. У нашому випадку цим словом є назва фрукта, але ми могли б шукати URL-адреси, імена файлів або що-небудь ще. У нашому прикладі нам буде достатньо видалити з рядків ті фрагменти, яку будуть відповідати нашому пошуку. Давайте зробимо це, як показано в лістингу 12.
Лістинг 12. Видалення нумерації рядків за допомогою sed
ian @ attic4: ~ / lpi103-7 $ cat text [1-3] | sed -ne "/ $ oursearch / s / $ oursearch // p" apple pear banana plum banana apple
У нашому останньому прикладі припустимо, що після імені фрукта в наших рядках можуть міститися інші дані. Ми додамо рядок "lemon pie" (лимонний пиріг) до нашими даними і подивимося, як можна позбутися від лимона. Також ми відсортуємо висновок і позбудемося повторюваних значень. У підсумку ми отримаємо список знайдених фруктів, що не містить повторень.
У лістингу 13 представлені два способи вирішення цього завдання. У першому з них ми видалили з кожного рядка нумерацію і символи-роздільники, а потім видалили всі дані після першого пробілу (або символу табуляції) і надрукували все, що залишилося. У другому прикладі ми використовували круглі дужки, щоб розбити всю рядок на три частини (число і наступний за ним знак-роздільник, друге слово і все інше). Потім ми використовуємо команду s для заміни всього рядка одним тільки другим словом і виводимо результат. Ви можете спробувати самостійно виконати цей приклад, опустивши третю частину, \ (. * \), І спробувати пояснити отриманий результат.
Лістинг 13. Остаточний список фруктів
ian @ attic4: ~ / lpi103-7 $ echo "7 lemon pie" | cat - text [1-3] | > Sed -ne "/$oursearch/s/\($oursearch\)\([^[:blank:]]*\)\(.*\)/\2/p" | > Sort | uniq apple banana lemon pear
Деякі більш ранні версії sed не підтримують використання розширеної форми синтаксису регулярних виразів. Якщо ви працюєте з такою версією, то використовуйте опцію -r, щоб вказати sed на те, що ви використовуєте розширену форму синтаксису. У лістингу 14 показано, що необхідно змінити в змінної oursearch і команді sed для виконання тих же дій з розширеними регулярними виразами, що були виконані в лістингу 13 з основними регулярними виразами.
Лістинг 14. Використання розширеної форми синтаксису регулярних виразів в sed
ian @ attic4: ~ / lpi103-7 $ echo "7 lemon pie" | cat - text [1-3] | > Sed -nre "/$oursearchx/s/($oursearchx)([^[:blank:]]*)(.*)/\2/p" | > Sort | uniq apple banana lemon pear plum
Ця стаття лише частково торкнулася питання роботи з регулярними виразами в командному рядку Linux з використанням grep і sed. Якщо ви хочете дізнатися більше про ці неоціненних інструментах, зверніться до відповідних man-сторінок.
Ресурси для скачування
Схожі тими
- Оригінал статті: Learn Linux, 101: Process execution priorities (EN).
- На Web-сайті програми сертифікації LPIC (EN) ви знайдете докладні цілі, списки завдання и зразкові питання всех трьох рівнів сертифікації на адміністратора Linux-систем професійного інституту Linux. Зокрема, на цьом сайті представлені цілі іспітів LPI 101 и LPI 102 станом на квітень 2009 року. Завжди Звертайтеся до Web-сайту програми сертифікації LPIC, щоб дізнатіся останні цілі.
- перегляньте всю серію статей для подготовки до іспитів інституту LPI (EN) на сайті developerWorks, Заснований на попередніх цілях, визначених до квітня 2009 року, щоб вівчіті основи адміністрування Linux и підготуватіся до іспитів для Отримання сертифікату адміністратора Linux.
- Прочитайте статтю " Основні завдання для початківців Linux-розробників "(EN) (developerWorks, березень 2005 року) і дізнайтеся, як відкрити вікно терміналу або командної оболонки, а також про багато іншого.
- Web-сайт Linux Documentation Project (EN) містить велику кількість корисної документації, особливо, HOWTO-посібників.
- В розділі Linux сайту developerWorks можна знайти додаткові ресурси для розробників Linux (включаючи розробників, тільки початківців роботу з Linux ), а також найпопулярніші серед наших читачів статті та керівництва (EN).
- подивіться всі поради по Linux (EN) і керівництва Linux (EN) на сайті developerWorks.
Підпішіть мене на ПОВІДОМЛЕННЯ до коментарів
Jsp?Ian @ attic4: ~ / lpi103-7 $ grep "x *" text1; echo $?
Символ?
В даному випадку значення символу?
Порівняйте регулярний вираз, що складаються з однієї точки, зі знаком?
E" text1 1 apple 2 pear ian @ attic4: ~ / lpi103-7 $ grep "pl \?
Які збіги були знайдені?
Включаючи круглі дужки, символи '?