Разделы сайта
Выбор редакции:
- На время полета отключить мобильный телефон
- Телефон службы поддержки киевстар или как позвонить оператору Дополнительная информация по обращению в справочную службу
- Левитирующая колонка красная Будущее, в котором возможны такие технические новинки, уже наступило
- Что такое майнинг криптовалюты простым языком
- Детализация звонков МТС: все способы получения распечатки звонков
- Интеграция виртуальной АТС Zadarma и Zoho CRM
- Цветомузыка на arduino Цветомузыка на микроконтроллере avr
- Настройка VPN-подключения средствами ОС Windows
- Что делать, если Mac греется на Windows Охлаждаем MacBook на Windows
- Ваш Mac начнёт дико тормозить, но это можно избежать
Реклама
Регулярные выражения Linux. Использование Grep и регулярных выражений для поиска текстовых шаблонов в Linux Регулярные выражения unix |
Об этом самоучителеДобро пожаловать в «Азы администрирования», второе из четырех обучающих руководств, разработанных чтобы подготовить вас к экзамену 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
Выше, первый параметр для grep, это regex; второй - имя файла. grep считывал каждую строчку из /etc/passwd и прикладывал на нее простую regex-подстроку «bash» в поисках совпадения. Если совпадение обнаруживалось, то grep выводил всю строку целиком; в противном случае, строка игнорировалась. Понимание простой подстрокиВ общем случае, если вы ищите подстроку, вы просто можете указать её буквально, не используя каких-либо «специальных» символов. Вам понадобиться особо позаботиться, только если ваша подстрока содержит +, ., *, [, ] или \, в этом случае эти символы должны быть экранированы обратным слешем, а подстрока заключаться в кавычки. Вот несколько примеров регулярных выражений в виде простой подстроки:
МетасимволыС помощью регулярных выражений используя метасимволы возможно осуществлять гораздо более сложный поиск, чем в примерах, которые недавно рассматривали. Один из таких метасимволов "." (точка), который совпадает с любым единичным символом: $ grep dev.sda /etc/fstab
В этом примере текст dev.sda не появляется буквально ни в одной из строчек из /etc/fstab . Однако, grep сканирует его не буквально по строке dev.sda, а по dev.sda шаблону. Запомните, что "." будет соответствовать любому единичному символу. Как вы видите, метасимвол "." функционально эквивалентен тому, как работает метасимвол "?" в glob-подстановках. ИспользованиеЕсли мы хотим задать символ конкретнее, чем это делает ".", то можем использовать [ и ] (квадратные скобки), чтобы указать подмножество символов для сопоставления: $ grep dev.sda /etc/fstab
Как вы заметили, в частности, данная синтаксическая конструкция работает идентично конструкции "" при glob-подстановке имен файлов. Опять же, в этом заключается одна из неоднозначностей в изучении регулярных выражений: синтаксис похожий, но не идентичный синтаксису glob-подстановок, что сбивает с толку. Использование [^]Вы можете обратить значение квадратных скобок поместив ^ сразу после [. В этому случае скобки будут соответствовать любому символу который НЕ перечислен внутри них. И опять, заметьте что [^] мы используем с регулярными выражением, а [!] с glob: $ grep dev.hda[^12] /etc/fstab
Отличающийся синтаксисОчень важно отметить, что синтаксис внутри квадратных скобок коренным образом отличается от остальной части регулярного выражения. К примеру, если вы поместите "." внутрь квадратных скобок, это позволит квадратным скобкам совпадать с "." буквально, также как 1 и 2 в примере выше. Для сравнения, "." помещенная вне квадратных скобок, будет интерпретирована как метасимвол, если не приставить "\". Мы можем получить выгоду из данного факта для вывода строк из /etc/fstab которые содержат строку dev.sda, как она записана: $ grep dev[.]sda /etc/fstab Также, мы могли бы набрать: $ grep "dev\.sda" /etc/fstab Эти регулярные выражения вероятно не удовлетворяют ни одной строчке из вашего /etc/fstab файла. Матасимвол *Некоторые метасимволы сами по себе не соответствуют ничему, но изменяют значение предыдущего символа. Один из таких символов, это * (звездочка), который используется для сопоставления нулевому или большему числу повторений предшествующего символа. Заметьте, это значит, что * имеет другое значение в регулярках, нежели в глоббинге. Вот несколько примеров, и обратите особое внимание на те случаи где сопоставление регулярных выражений отличается от glob-подстановок:
Итак, повторим для закрепления: строчка «ac» подходит под регулярное выражение «ab*c» потому, что звездочка также позволяет повторение предшествующего выражения (b) ноль раз. И опять, ценно отметить для себя, что метасимвол * в регулярках интерпретируется совершенно иначе, нежели символ * в glob-подстновках. Начало и конец строкиПоследние метасимволы, что мы детально рассмотрим, это ^ и $, которые используются для сопостовления началу и концу строки, соответственно. Воспользовавшись ^ в начале вашего regex, вы «прикрепите» ваш шаблон к началу строки. В следующием примере, мы используем регулярное выражение ^#, которое удовлетворяет любой строке начинающийся с символа #:
$ grep ^# /etc/fstab
Полнострочные регулярки^ и $ можно комбинировать, для сопоставлений со всей строкой целиком. Например, нижеследующая регулярка будет соответсвовать строкам начинающимся с символа #, а заканчивающимся символом ".", при произвольном количестве символов между ними:
$ grep "^#.*\.$" /etc/fstab
В примере выше мы заключили наше регулярное выражение в одиночные кавычки, чтобы предотвратить интерпретирование символа $ командной оболочкой. Без одиночных кавычек $ исчез бы из нашей регулярки еще даже до того, как grep мог его увидеть. Об авторахDaniel RobbinsДэниэль Роббинс - основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo , написал множество технических статей для IBM developerWorks , Intel Developer Services и C/C++ Users Journal. Chris HouserКрис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure . Aron GriffisЭйрон Гриффис живет на территории Бостона, где провел последнее десятилетие работая в Hewlett-Packard над такими проектами, как сетевые UNIX-драйвера для Tru64, сертификация безопасности Linux, Xen и KVM виртуализация, и самое последнее - платформа HP ePrint . В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки». Одна из наиболее полезных и многофункциональных команд в терминале Linux – команда «grep». Название представляет собой акроним английской фразы «search Globally for lines matching the Regular Expression, and Print them» (искать везде соответствующие регулярному выражению строки и выводить их). Команда «grep» просматривает входной поток последовательно, строка за строкой, в поисках совпадений и выводит (отфильтровывает) только те строки, которые содержат текст, совпадающий с заданным шаблоном – регулярным выражением . Регулярные выражения - специальный формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов. Сейчас уже практически все современные языки программирования имеют встроенную поддержку регулярных выражений для обработки текстов, однако исторически популяризации данного подхода во многом способствовал именно мир UNIX и в частности идеи, заложенные в команды «grep», «sed» и др. Философия «все есть файл» полностью пронизывает UNIX и владение инструментами для работы с текстовыми файлами является одним из обязательных навыков каждого пользователя Linux. ОБРАЗЕЦGIST | Простейший поиск всех строк, в которых есть текст «Adams». При оформлении этого и последующих примеров будем придерживаться следующего порядка: сверху параметры командной строки, внизу стандартные потоки слева ввода stdin и справа вывода stdout . Команда «grep» имеет внушительное количество опций, которые можно указать при запуске. С помощью этих опций можно делать много полезных вещей и при этом в принципе даже не обязательно хорошо разбираться в синтаксисе регулярных выражений. ОПЦИИНачнём с того, что «grep» умеет не только фильтровать стандартный ввод stdin , но и осуществлять поиск по файлам. По умолчанию «grep» будет искать только в файлах, находящихся в текущем каталоге, однако при помощи очень полезной опции --recursive можно сказать команде «grep» искать рекурсивно начиная с заданной директории. GIST | По умолчанию команда «grep» чувствительна к регистру. Следующий пример показывает как можно искать и при этом не учитывать регистр, например «Adams» и «adams» одно и то же: Ignore-case "adams" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801 GIST | Поиск наоборот (иногда говорят инвертный поиск), то есть будут выведены все строки, кроме имеющих вхождение указанного шаблона: Invert-match "Adams" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington, 1789-1797 Thomas Jefferson, 1801-1809 GIST | Опции конечно же можно и нужно комбинировать друг с другом. Например поиск наоборот с выводом порядковых номеров строк с вхождениями: Line-number --invert-match "Adams" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 1:George Washington, 1789-1797 3:Thomas Jefferson, 1801-1809 GIST | Раскраска. Иногда удобно, когда искомое нами слово подсвечивается цветом. Все это уже есть в «grep», остается только включить: Line-number --color=always "Adams" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 2:John Adams, 1797-1801 GIST | Мы хотим выбрать все ошибки из лог файла, но знаем что в следующей сточке после ошибки может содержаться полезная информация, тогда удобно вывести несколько строк из контекста. По умолчанию «grep» выводит лишь строку, в которой было найдено совпадение, но есть несколько опций, позволяющих заставить «grep» выводить больше. Для вывода нескольких строк (в нашем случае двух) после вхождения: Color=always -A2 "Adams" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 GIST | Аналогично для дополнительного вывода нескольких строк перед вхождением: Color=always -B2 "James" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 GIST | Однако чаще всего требуется выводить симметричный контекст, для этого есть ещё более сокращённая запись. Выведем по две строки как сверху так и снизу от вхождения: Color=always -C2 "James" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 John Quincy Adams, 1825-1829 Andrew Jackson, 1829-1837 Martin Van Buren, 1837-1841 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 John Quincy Adams, 1825-1829 Andrew Jackson, 1829-1837 GIST | Когда Вы ищете qwe , то по умолчанию «grep» будет выводить также, qwe123 , 345qwerty и тому подобные комбинации. Найдём только те строки, которые выключают именно всё слово целиком: Word-regexp --color=always "John" John Fitzgerald Kennedy, 1961-1963 Lyndon Baines Johnson, 1963-1969 John Fitzgerald Kennedy, 1961-1963 GIST | Ну и напоследок если Вы просто хотите знать количество строк с совпадениями одним единственным числом, но при этом не выводить больше ничего: Count --color=always "John" John Fitzgerald Kennedy, 1961-1963 Lyndon Baines Johnson, 1963-1969 Richard Milhous Nixon, 1969-1974 2 Стоит отметить, что у большинства опций есть двойник, например --ignore-case можно привести к более короткому виду -i и т.д. БАЗОВЫЕ РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯВсе регулярные выражения состоят из двух типов символов: стандартных текстовых символов, называемых литералами , и специальных символов, называемых метасимволами . В предыдущих примерах поиск осуществлялся по литералам (точное совпадение по буквам), но дальше будет куда интересней. Добро пожаловать в мир регулярных выражений! Знак каретки ^ и доллара $ имеют в регулярном выражении особый смысл. Их называют «якорями» (anchor). Якоря – это специальные символы, которые указывают местонахождение в строке необходимого совпадения. Когда поиск доходит до якоря, он проверяет, есть ли соответствие, и если есть – продолжает идти по шаблону, не прибавляя ничего к результату . GIST | Якорь каретка используют чтобы указать, что регулярное выражение необходимо проверить именно с начала строки: Color=always "^J" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801 GIST | Аналогично якорь доллар стоит использовать в конце шаблона, чтобы указать, что совпадение действительно только если искомая строка символов находится в конце текстовой строки и никак иначе: Color=always "9$" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 Thomas Jefferson, 1801-1809 GIST | Любой символ. Символ точка используется в регулярных выражениях для того, чтобы обозначить, что в указанном месте может находиться абсолютно любой символ: Color=always "0.$" GIST | Экранирование. Если нужно найти именно символ точка, тогда экранирование в помощь. Знак экранирования (как правило это обратный слеш), предшествующий символу вроде точки, превращает метасимвол в литерал: Color=always "\." George Washington. 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington. 1789-1797 GIST | Классы символов. В регулярных выражениях можно использовать диапазоны и классы символов. Для этого при составлении шаблона используются квадратные скобки. Поместив группу символов (включая символы, которые в противном случае были бы истолкованы как метасимволы) в квадратные скобки, можно указать, что в данной позиции может находиться любой из взятых в скобки символов: Color=always "0" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 GIST | Диапазон. Это два символа, разделенные дефисом, например, 0-9 (десятичные цифры) или 0-9a-fA-F (шестнадцатеричные цифры): Color=always "" George Washington, ??? John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 GIST | Отрицание. Если первым символом выражения в квадратных скобках является каретка, то остальные символы принимаются как набор символов, которые не должны присутствовать в заданной позиции регулярного выражения: Color=always "[^7]$" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 GIST | Классы символов POSIX. Существует некий набор уже заранее заготовленных классов символов, которые Вы можете использовать в регулярных выражениях. Их там с десяток, достаточно быстро просмотреть мануал чтобы понять назначение каждого. Например отфильтруем только шестнадцатеричные цифры: Color=always "^[[:xdigit:]]*$" 4.2 42 42abc 42 42abc GIST | Повторение (0 или больше раз). Одним из наиболее часто используемых метасимволов является символ звёздочка, что означает «повторить предыдущий символ или выражение ноль или больше раз»: Color=always "^*$" George Washington, ??? John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington, ??? Различают базовые регулярные выражения BRE (basic regular expressions) и расширенные ERE (extended regular expressions). В BRE распознаются следующие метасимволы ^ $ . * и все другие символы расцениваются как литералы. В ERE добавлены ещё такие метасимволы () { } ? + | и связанные с ними функции. Ну а чтобы всех окончательно запутать в «grep» придумали такую штуку – символы () { } в BRE обрабатываются как метасимволы, если они экранированы обратным слешем, в то время как в ERE постановка перед любыми метасимволами обратного слеша приводит к тому, что они трактуются как литералы. РАСШИРЕННЫЕ РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯGIST | Дизъюнкция. Подобно тому, как квадратные скобки задают различные возможные варианты совпадения одного символа, дизъюнкция позволяет указать альтернативные совпадения для строк символов или выражений. Для обозначения дизъюнкции используется символ вертикальной черты: Extended-regexp --color=always "George|John" George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington, 1789-1797 John Adams, 1797-1801 GIST | Совпадение ноль или один раз. В расширенных регулярных выражениях существуют несколько дополнительных метасимволов, указывающих частоту повторения символа или выражения (подобно тому, как метасимвол звездочка указывает на совпадения 0 или более раз). Один из таких метасимволов это вопросительный знак, который делает предыдущий символ или выражение, по сути, необязательными: Extended-regexp --color=always "^(Andrew)?John" John Adams, 1797-1801 Andrew Johnson, 1865-1869 Lyndon Baines Johnson, 1963-1969 John Adams, 1797-1801 Andrew Johnson, 1865-1869 GIST | Совпадение один или более раз. Для этого предусмотрен метасимвол в виде знака плюс. Он работает почти как символ звездочка, за исключением того, что выражение должно совпасть хотя бы один раз: Extended-regexp --color=always "^[[:alpha:] ]+$" John Adams Andrew Johnson, 1865-1869 Lyndon Baines Johnson, 1963-1969 John Adams GIST | Совпадение указанное количество раз. Для этого можно использовать фигурные скобки. Эти метасимволы используются для указания точного количества, диапазона, а также верхнего и нижнего предела количества совпадений выражения: Extended-regexp --color=always "{1,3}\.{1,3}\.{1,3}\.{1,3}" 42 127.0.0.1 127.0.0.1 Команда grep настолько полезна, многофункциональна и проста в употреблении, что, однажды познакомившись с ней, невозможно представить себе работу без нее. Утилита grep — это очень мощное средство для поиска и фильтрации текстовой информации. В этой статье показаны несколько примеров ее использования, которые позволят по достоинству оценить ее возможности. $ grep needle haystack.txt В результате grep отобразит все вхождения needle, которые он встретит в содержимом файла haystack.txt. Важно заметить, что в этом случае grep ищет именно набор символов, а не слово. Например, будут отображены строки, включающие слово “needless” и другие слова, в которых встречается последовательность “needle”. $ grep -w needle haystack.txt Не обязательно ограничивать область поиска только одним файлом, grep может выполнять поиск и по группе файлов, причем в результатах поиска будет указан файл, в котором обнаружено совпадение. Ключ -n добавит еще и номер строки, в которой обнаружено совпадение, а ключ -r позволит выполнить рекурсивный поиск. Это очень удобно при поиске среди файлов с исходными текстами программ. $ grep -rnw function_name /home/www/dev/myprogram/ Имя файла будет указано перед каждым совпадением. Если вам необходимо скрыть имена файлов, воспользуйтесь ключом -h, напротив, если необходимы только имена файлов, то укажите ключ -l $ grep -wo http://.* channel.log | tail Параметр -o указывает grep, что следует выводить лишь совпадение с шаблоном, а не всю строку. Вывод grep при помощи pipe перенаправляем команде tail, которая по умолчанию выводит 10 последних строк. $ grep -c "^user_at_(home|work)" channel.log С параметром -c grep выводит лишь количество найденных совпадений, а не сами совпадения. Строка поиска заключена в кавычки потому, что в ней содержатся специальные символы, которые могут распознаны оболочкой как управляющие. Обратите внимание, что кавычки не входят в шаблон поиска. Обратный слэш "" служит для экранирования служебных символов. $ 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 User:/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», вместо него можно подставить любое другое. В отличие от предыдущего примера, теперь отобразим только те строки, которые начинаются со строки «root»: # grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash Если мы хотим увидеть, в каких учетных записях командная оболочка вообще не использовалась, мы ищем строки, заканчивающиеся сиволом «:»: # grep:$ /etc/passwd news:x:9:13:news:/var/spool/news: Чтобы проверить, экспортируется ли в файле ~/.bashrc переменная PATH, сначала выберите строки с «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: floppy:x:19: xfs:x:43: nfsnobody:x:65534: postfix:x:89: В примере отображаются все строки, содержащие либо символ «y», либо символ «f». Используйте «.» для поиска соответствия любому одиночному символу. Если вы хотите получить список всех английских слов, взятых из словаря, содержащих пять символов, начинающихся с «c» и заканчивающихся «h» (удобно для решения кроссвордов):
# grep " Если вы хотите отобразить строки, в которых есть символ точки в виде литерала, то укажите в команде grep параметр -F. Символы "< " и «>» означают наличие пустой строки до и соответственно после указанных букв. Это значит, что слова в файл words должны быть записаны соответствующим образом. Если вы хотите найти все слова в тексте по указанному шаблоны без учета пустых строк опустите символы "< " и «>», для более точного поиска только слов используйте ключ -w. Чтобы подобным образом найти слова, в которых между «c» и «h» может находиться любое число символов, используйте звездочку (*). В приведенном ниже примере из системного словаря выбираются все слова, начинающиеся с «c» и заканчивающиеся символом «h»:
# grep " Если вы хотите найти в файле или в выходном потоке литеральный символ «звездочка», используйте для этого одинарные кавычки. Пользователь в приведенном ниже примере сначала пытается в файле /etc/profile найти «звездочку» без использования кавычек, в результате чего ничего не находится. Когда используются кавычки, в выходной поток выдается результат: # grep * /etc/profile # grep "*" /etc/profile for i in /etc/profile.d/*.sh ; do Доброго времени, гости! В сегодняшней статье хочу коснуться такой огромной темы как Регулярные выражения . Думаю всем известно, что тема регексов (так регулярные выражения называются на сленге) - необъятна в объеме одного поста. Посему постараюсь кратко, но как можно понятней собрать в кучу свои мысли и донести их до Вас в . Начну с того, что существует несколько разновидностей регулярных выражений: 1. Традиционные регулярные выражения (они же основные, базовые и basic regular expressions (BRE))
2. Расширенные регулярные выражения (они же extended regular expressions (ERE))
3. Регулярные выражения, совместимые с Perl (они же Perl-compatible regular expressions (PCRE))
Регулярные выражения состоят из шаблонов, вернее сказать задают шаблон поиска. Шаблон состоит из правил поиска, которые составляются из символов и метасимволов . Правила поиска определяются следующими операциями : Перечисление |Вертикальная черта (|) разделяет допустимые варианты, можно сказать - логическое ИЛИ. Например, «gray|grey» соответствует gray или grey . Группировка или объединение ()Круглые скобки используются для определения области действия и приоритета операторов. Например, «gray|grey» и «gr(a|e)y» являются разными образцами, но они оба описывают множество, содержащее gray и grey . Квантификация {} ? * +Квантификатор после символа или группы определяет, сколько раз предшествующее выражение может встречаться. общее выражение, повторений может быть от m до n включительно . общее выражение, m и более повторений . общее выражение, не более n повторений . ровно n повторений . Знак вопроса означает 0 или 1 раз, то же самое, что и {0,1} . Например, «colou?r» соответствует и color , и colour . Звёздочка означает 0, 1 или любое число раз ({0,} ). Например, «go*gle» соответствует ggle , gogle , google и др. Плюс означает хотя бы 1 раз ({1,} ). Например, «go+gle» соответствует gogle , google и т. д. (но не ggle ). Конкретный синтаксис данных регулярных выражений зависит от реализации. (то есть в базовых регулярных выражениях символы { и } - экранируются обратным слешем) Метасимволы , говоря простым языком - это символы, которые не соответствуют своему реальному значению, то есть символ. (точка) - это не точка, а любой один символ, и т.п. прошу ознакомиться с метасимволами и их значениями:
Метасимволы нам помогают использовать различные соответствия. Но как же представить метасимвол обычным символом, то есть символ [ (квадратная скобка) значением квадратной скобки? Просто:
Для упрощения задания некоторых наборов символов, их объединили в т.н.классы и категории символов . POSIX стандартизовал объявление некоторых классов и категорий символов, как показано в следующей таблице:
В regex есть такое понятие как: Жадность regexПостараюсь описать как можно понятней. Допустим, мы хотим найти все HTML теги в каком-то тексте. Локализовав задачу, мы хотим найти значения заключенные между < и >, вместе с этими самыми скобками. Но мы знаем, что теги имеют разную длину и самих тегов, как минимум штук 50. Перечислять их все, заключив в метасимволы - задача слишком трудоемкая. Но мы знаем, что у нас есть выражение.* (точка звездочка), характеризующее любое число любых символов в строке. С помощью данного выражения мы попытаемся найти в тексте ( Итак, Как создать RAID уровня 10/50 на контроллере LSI MegaRAID (актуально и для: Intel SRCU42x, Intel SRCS16): ) все значения между < и >. В результате, этому выражению будет соответствовать ВСЯ строка. почему, потому что регекс - ЖАДЕН и старается захватить ЛЮБОЕ ВСЕ количество символов между < и >, соответственно вся строка, начиная < p>Итак,... и заканчивая ...> будет принадлежать данному правилу!Надеюсь, на примере понятно что такое жадность. Чтобы избавиться от данной жадности, можно пойти по следующему пути:
Все вышенаписанное хочу дополнить синтаксисом расширенных регулярных выражений: Регулярные выражения в POSIX аналогичны традиционному Unix-синтаксису, но с добавлением некоторых метасимволов: Плюс указывает на то, что предыдущий символ или группа может повторяться один или несколько раз . В отличие от звёздочки, хотя бы одно повторение обязательно. Знак вопроса делает предыдущий символ или группу необязательной. Другими словами, в соответствующей строке она может отсутствовать, либо присутствовать ровно один раз. Вертикальная черта разделяет альтернативные варианты регулярных выражений. Один символ задаёт две альтернативы, но их может быть и больше, достаточно использовать больше вертикальных чёрточек. Необходимо помнить, что этот оператор использует максимально возможную часть выражения. По этой причине, оператор альтернативы чаще всего используется внутри скобок. Также было отменено использование обратной косой черты: \{…\} становится {…} и \(…\) становится (…). В завершение поста, приведу некоторые примеры использования regex: $ cat text1 1 apple 2 pear 3 banana $ grep p text1 1 apple 2 pear $ grep "pp*" text1 1 apple 2 pear $ cat text1 | grep "l\|n" 1 apple 3 banana $ echo -e "find an\n* here" | grep "\*" * here $ grep "pl\?.*r" text1 # p, в строках где есть r 2 pear $ grep "a.." text1 # строки с a, за которой следует как минимум 2 символа 1 apple 3 banana $ grep "" text1 # поиск строк, где есть 3 или p 1 apple 2 pear 3 banana $ echo -e "find an\n* here\nsomewhere." | grep "[.*]" * here somewhere..name]$ echo -e "123\n456\n789\n0" | grep "" 123 456 789 $ sed -e "/\(a.*a\)\|\(p.*p\)/s/a/A/g" text1 # замена а на А во всех строках, где после а идет а или после р идет р 1 Apple 2 pear 3 bAnAnA *\./ LAST WORD./g" First. A LAST WORD. This is a LAST WORD. С Уважением, Mc.Sim! Регулярные выражения - это очень мощный инструмент для поиска текста по шаблону, обработки и изменения строк, который можно применять для решения множества задач. Вот основные из них:
Это далеко не полный список, регулярные выражения позволяют делать намного больше. Но для новых пользователей они могут показаться слишком сложными, поскольку для их формирования используется специальный язык. Но учитывая предоставляемые возможности, регулярные выражения Linux должен знать и уметь использовать каждый системный администратор. В этой статье мы рассмотрим регулярные выражения bash для начинающих, чтобы вы смогли разобраться со всеми возможностями этого инструмента. В регулярных выражениях могут использоваться два типа символов:
Обычные символы - это буквы, цифры и знаки препинания, из которых состоят любые строки. Все тексты состоят из букв и вы можете использовать их в регулярных выражениях для поиска нужной позиции в тексте. Метасимволы - это кое-что другое, именно они дают силу регулярным выражениям. С помощью метасимволов вы можете сделать намного больше чем поиск одного символа. Вы можете искать комбинации символов, использовать динамическое их количество и выбирать диапазоны. Все спецсимволы можно разделить на два типа, это символы замены, которые заменяют собой обычные символы, или операторы, которые указывают сколько раз может повторяться символ. Синтаксис регулярного выражения будет выглядеть таким образом: обычный_символ спецсимвол_оператор спецсимвол_замены спецсимвол_оператор
Важно отметить, что перед буквенными спецсимволами нужно использовать косую черту, чтобы указать, что дальше идет спецсимвол. Правильно и обратное, если вы хотите использовать спецсимвол, который применяется без косой черты в качестве обычного символа, то вам придется добавить косую черту. Например, вы хотите найти в тексте строку 1+ 2=3. Если вы используете эту строку в качестве регулярного выражения, то ничего не найдете, потому что система интерпретирует плюс как спецсимвол, который сообщает, что предыдущая единица должна повториться один или больше раз. Поэтому его нужно экранировать: 1 \+ 2 = 3. Без экранирования наше регулярное выражение соответствовало бы только строке 11=3 или 111=3 и так далее. Перед равно черту ставить не нужно, потому что это не спецсимвол. Примеры использования регулярных выраженийТеперь, когда мы рассмотрели основы и вы знаете как все работает, осталось закрепить полученные знания про регулярные выражения linux grep на практике. Два очень полезные спецсимвола - это ^ и $, которые обозначают начало и конец строки. Например, мы хотим получить всех пользователей, зарегистрированных в нашей системе, имя которых начинается на s. Тогда можно применить регулярное выражение "^s" . Вы можете использовать команду egrep: egrep "^s" /etc/passwd Если мы хотим отбирать строки по последнему символу в строке, что для этого можно использовать $. Например, выберем всех системных пользователей, без оболочки, записи о таких пользователях заканчиваются на false: egrep "false$" /etc/passwd Чтобы вывести имена пользователей, которые начинаются на s или d используйте такое выражение: egrep "^" /etc/passwd Такой же результат можно получить, использовав символ "|". Первый вариант более пригоден для диапазонов, а второй чаще применяется для обычных или/или: egrep "^" /etc/passwd Теперь давайте выберем всех пользователей, длина имени которых составляет не три символа. Имя пользователя завершается двоеточием. Мы можем сказать, что оно может содержать любой буквенный символ, который должен быть повторен три раза, перед двоеточием: egrep "^\w{3}:" /etc/passwd ВыводыВ этой статье мы рассмотрели регулярные выражения Linux, но это были только самые основы. Если копнуть чуть глубже, вы найдете что с помощью этого инструмента можно делать намного больше интересных вещей. Время, потраченное на освоение регулярных выражений, однозначно будет стоить того. На завершение лекция от Яндекса про регулярные выражения:
|
Читайте: |
---|
Популярное:
Picmonkey — быстрый онлайн фоторедактор Frames |
Новое
- Телефон службы поддержки киевстар или как позвонить оператору Дополнительная информация по обращению в справочную службу
- Левитирующая колонка красная Будущее, в котором возможны такие технические новинки, уже наступило
- Что такое майнинг криптовалюты простым языком
- Детализация звонков МТС: все способы получения распечатки звонков
- Интеграция виртуальной АТС Zadarma и Zoho CRM
- Цветомузыка на arduino Цветомузыка на микроконтроллере avr
- Настройка VPN-подключения средствами ОС Windows
- Что делать, если Mac греется на Windows Охлаждаем MacBook на Windows
- Ваш Mac начнёт дико тормозить, но это можно избежать
- Какие особенности игры на европейском сервере Archeage