Регулярные выражения linux пробел

Bash-скрипты: регулярные выражения

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

Этот материал задуман как введение в регулярные выражения, рассчитанное на тех, кто может совершенно не знать о том, что это такое. Поэтому начнём с самого начала.

  • 1 Что такое регулярные выражения
  • 2 Типы регулярных выражений
  • 3 Регулярные выражения POSIX BRE
  • 4 Специальные символы
  • 5 Якорные символы
  • 6 Символ «точка»
  • 7 Классы символов
  • 8 Отрицание классов символов
  • 9 Диапазоны символов
  • 10 Специальные классы символов
  • 11 Символ «звёздочка»
  • 12 Регулярные выражения POSIX ERE
    • 12.1 ▍Вопросительный знак
    • 12.2 ▍Символ «плюс»
    • 12.3 ▍Фигурные скобки
    • 12.4 ▍Символ логического «или»
    • 14.1 ▍Подсчёт количества файлов
    • 14.2 ▍Проверка адресов электронной почты

    Что такое регулярные выражения

    У многих, когда они впервые видят регулярные выражения, сразу же возникает мысль, что перед ними бессмысленное нагромождение символов. Но это, конечно, далеко не так. Взгляните, например, на это регулярное выражение

    ^ ( [ a — zA — Z0 — 9_ \ — \ . \ + ] + ) @ ( [ a — zA — Z0 — 9_ \ — \ . ] + ) \ . ( [ a — zA — Z ] < 2 , 5 >) $

    На наш взгляд даже абсолютный новичок сходу поймёт, как оно устроено и зачем нужно 🙂 Если же вам не вполне понятно — просто читайте дальше и всё встанет на свои места.
    Регулярное выражение — это шаблон, пользуясь которым программы вроде sed или awk фильтруют тексты. В шаблонах используются обычные ASCII-символы, представляющие сами себя, и так называемые метасимволы, которые играют особую роль, например, позволяя ссылаться на некие группы символов.

    Типы регулярных выражений

    Реализации регулярных выражений в различных средах, например, в языках программирования вроде Java, Perl и Python, в инструментах Linux вроде sed, awk и grep, имеют определённые особенности. Эти особенности зависят от так называемых движков обработки регулярных выражений, которые занимаются интерпретацией шаблонов.
    В Linux имеется два движка регулярных выражений:

    • Движок, поддерживающий стандарт POSIX Basic Regular Expression (BRE).
    • Движок, поддерживающий стандарт POSIX Extended Regular Expression (ERE).

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

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

    Существует много способов разработки регулярных выражений, зависящих и от мнения программиста, и от особенностей движка, под который их создают. Непросто писать универсальные регулярные выражения, которые сможет понять любой движок. Поэтому мы сосредоточимся на наиболее часто используемых регулярных выражениях и рассмотрим особенности их реализации для sed и awk.

    Регулярные выражения POSIX BRE

    Пожалуй, самый простой шаблон BRE представляет собой регулярное выражение для поиска точного вхождения последовательности символов в тексте. Вот как выглядит поиск строки в sed и awk:

    Источник

    Регулярные выражения в Grep (Regex)

    grep — одна из самых полезных и мощных команд Linux для обработки текста. grep ищет в одном или нескольких входных файлах строки, соответствующие регулярному выражению, и записывает каждую совпадающую строку в стандартный вывод.

    В этой статье мы собираемся изучить основы использования регулярных выражений в GNU-версии grep , которая по умолчанию доступна в большинстве операционных систем Linux.

    Регулярное выражение Grep

    Регулярное выражение или регулярное выражение — это шаблон, который соответствует набору строк. Шаблон состоит из операторов, конструирует буквальные символы и метасимволы, которые имеют особое значение. GNU grep поддерживает три синтаксиса регулярных выражений: базовый, расширенный и Perl-совместимый.

    В своей простейшей форме, когда тип регулярного выражения не указан, grep интерпретирует шаблоны поиска как базовые регулярные выражения. Чтобы интерпретировать шаблон как расширенное регулярное выражение, используйте параметр -E (или —extended-regexp ).

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

    Буквальные совпадения

    Наиболее простое использование команды grep — поиск буквального символа или серии символов в файле. Например, чтобы отобразить все строки, содержащие строку «bash» в /etc/passwd , вы должны выполнить следующую команду:

    Результат должен выглядеть примерно так:

    root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash 

    В этом примере строка «bash» представляет собой базовое регулярное выражение, состоящее из четырех буквальных символов. Это указывает grep искать строку, в которой сразу после grep «b» идут «a», «s» и «h».

    По умолчанию команда grep чувствительна к регистру. Это означает, что символы верхнего и нижнего регистра рассматриваются как разные.

    Чтобы игнорировать регистр при поиске, используйте параметр -i (или —ignore-case ).

    Важно отметить, что grep ищет шаблон поиска как строку, а не слово. Итак, если вы искали «gnu», grep также напечатает строки, в которых «gnu» встроено в слова большего размера, например, «cygnus» или «magnum».

    Если в строке поиска есть пробелы, вам нужно заключить ее в одинарные или двойные кавычки:

    grep "Gnome Display Manager" /etc/passwd

    Якорь

    Якоря — это метасимволы, которые позволяют указать, где в строке должно быть найдено совпадение.

    Символ ^ (каретка) соответствует пустой строке в начале строки. В следующем примере строка «linux» будет соответствовать только в том случае, если она встречается в самом начале строки.

    Символ $ (доллар) соответствует пустой строке в начале строки. Чтобы найти строку, заканчивающуюся строкой «linux», вы должны использовать:

    Вы также можете создать регулярное выражение, используя оба якоря. Например, чтобы найти строки, содержащие только «linux», выполните:

    Еще один полезный пример — шаблон ^$ , который соответствует всем пустым строкам.

    Соответствующий одиночный символ

    Файл . (точка) символ — это метасимвол, который соответствует любому одиночному символу. Например, чтобы сопоставить все, что начинается с «кан», затем имеет два символа и заканчивается строкой «ру», вы должны использовать следующий шаблон:

    Выражения в скобках

    Выражения в квадратных скобках позволяют сопоставить группу символов, заключив их в квадратные скобки [] . Например, найдите строки, содержащие «принять» или «акцент», вы можете использовать следующее выражение:

    Если первый символ внутри скобок — это курсор ^ , то он соответствует любому одиночному символу, не заключенному в скобки. Следующий шаблон будет соответствовать любой комбинации строк, начинающихся с «co», за которыми следует любая буква, кроме «l», за которой следует «la», например «coca», «cobalt» и т. Д., Но не будет соответствовать строкам, содержащим «cola». ”:

    Вместо того, чтобы помещать символы по одному, вы можете указать диапазон символов внутри скобок. Выражение диапазона создается путем указания первого и последнего символов диапазона, разделенных дефисом. Например, [aa] эквивалентно [abcde] а 1 эквивалентно [123] .

    Следующее выражение соответствует каждой строке, начинающейся с заглавной буквы:

    grep также поддерживает предопределенные классы символов, заключенные в скобки. В следующей таблице показаны некоторые из наиболее распространенных классов символов:

    Квантификатор Классы персонажей
    [:alnum:] Буквенно-цифровые символы.
    [:alpha:] Буквенные символы.
    [:blank:] Пробел и табуляция.
    [:digit:] Цифры.
    [:lower:] Строчные буквы.
    [:upper:] Заглавные буквы.

    Полный список всех классов персонажей можно найти в руководстве по Grep .

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

    Квантификаторы позволяют указать количество вхождений элементов, которые должны присутствовать, чтобы совпадение произошло. В следующей таблице показаны квантификаторы, поддерживаемые GNU grep :

    Квантификатор Описание
    * Сопоставьте предыдущий элемент ноль или более раз.
    ? Соответствует предыдущему элементу ноль или один раз.
    + Сопоставьте предыдущий элемент один или несколько раз.
    Сравните предыдущий элемент ровно n раз.
    Сопоставьте предыдущий элемент не менее n раз.
    Соответствовать предыдущему элементу не более m раз.
    Сопоставьте предыдущий элемент от n до m раз.

    Символ * (звездочка) соответствует предыдущему элементу ноль или более раз. Следующее будет соответствовать «right», «sright», «ssright» и так далее:

    Ниже представлен более сложный шаблон, который соответствует всем строкам, которые начинаются с заглавной буквы и заканчиваются точкой или запятой. Регулярное выражение .* Соответствует любому количеству любых символов:

    ? (знак вопроса) символ делает предыдущий элемент необязательным и может соответствовать только один раз. Следующие будут соответствовать как «ярким», так и «правильным». ? Символ экранирован обратной косой чертой, потому что мы используем базовые регулярные выражения:

    Вот то же регулярное выражение с использованием расширенного регулярного выражения:

    Символ + (плюс) соответствует предыдущему элементу один или несколько раз. Следующее будет соответствовать «sright» и «ssright», но не «right»:

    Фигурные скобки <> позволяют указать точное число, верхнюю или нижнюю границу или диапазон вхождений, которые должны произойти, чтобы совпадение произошло.

    Следующее соответствует всем целым числам, содержащим от 3 до 9 цифр:

    Чередование

    Термин «чередование» представляет собой простое «ИЛИ». Оператор чередования | (pipe) позволяет вам указать различные возможные совпадения, которые могут быть буквальными строками или наборами выражений. Этот оператор имеет самый низкий приоритет среди всех операторов регулярных выражений.

    В приведенном ниже примере мы ищем все вхождения слов fatal , error и critical в файле ошибок журнала Nginx :

    grep 'fatal|error|critical' /var/log/nginx/error.log

    Если вы используете расширенное регулярное выражение, то оператор | не следует экранировать, как показано ниже:

    grep -E 'fatal|error|critical' /var/log/nginx/error.log

    Группировка

    Группировка — это функция регулярных выражений, которая позволяет группировать шаблоны вместе и ссылаться на них как на один элемент. Группы создаются с помощью круглых скобок () .

    При использовании основных регулярных выражений скобки должны быть экранированы обратной косой чертой ( ).

    Следующий пример соответствует как «бесстрашный», так и «меньший». ? квантификатор делает группу (fear) необязательной:

    Специальные выражения обратной косой черты

    GNU grep включает несколько метасимволов, которые состоят из обратной косой черты, за которой следует обычный символ. В следующей таблице показаны некоторые из наиболее распространенных специальных выражений обратной косой черты:

    Выражение Описание
    b Сопоставьте границу слова.
    Соответствует пустой строке в начале слова.
    > Соответствует пустой строке в конце слова.
    w Подберите слово.
    s Подберите пробел.

    Следующий шаблон будет соответствовать отдельным словам «abject» и «object». Он не будет соответствовать словам, если вложен в слова большего размера:

    Выводы

    Регулярные выражения используются в текстовых редакторах, языках программирования и инструментах командной строки, таких как grep , sed и awk . Знание того, как создавать регулярные выражения, может быть очень полезным при поиске текстовых файлов, написании сценариев или фильтрации вывода команд.

    Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

    Источник

    Читайте также:  Добавление переменной окружения linux
Оцените статью
Adblock
detector