Поиск по сайту:

Использование Grep и регулярных выражений для поиска текстовых шаблонов в Linux


Введение

Команда grep — одна из самых полезных команд в терминальной среде Linux. Имя grep означает \глобальное регулярное выражение печати. Это означает, что вы можете использовать grep, чтобы проверить, соответствует ли полученный ввод заданному шаблону. Эта, казалось бы, тривиальная программа является чрезвычайно мощным; его способность сортировать ввод на основе сложных правил делает его популярным звеном во многих цепочках команд.

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

Предпосылки

Чтобы следовать этому руководству, вам потребуется доступ к компьютеру с операционной системой на базе Linux. Это может быть либо виртуальный частный сервер, к которому вы подключились с помощью SSH, либо ваша локальная машина. Обратите внимание, что это руководство было проверено с использованием сервера Linux с Ubuntu 20.04, но приведенные примеры должны работать на компьютере с любой версией любого дистрибутива Linux.

Если вы планируете использовать удаленный сервер, чтобы следовать этому руководству, мы рекомендуем вам сначала выполнить наше руководство по начальной настройке сервера. Это создаст для вас безопасную серверную среду, включая пользователя без полномочий root с привилегиями sudo и брандмауэр, настроенный с помощью UFW, которые вы сможете использовать для развития своих навыков работы с Linux.

Основное использование

В этом руководстве вы будете использовать grep для поиска в Стандартной общественной лицензии GNU версии 3 различных слов и фраз.

Если вы работаете в системе Ubuntu, вы можете найти файл в папке /usr/share/common-licenses. Скопируйте его в свой домашний каталог:

  1. cp /usr/share/common-licenses/GPL-3 .

Если вы работаете в другой системе, используйте команду curl для загрузки копии:

  1. curl -o GPL-3 https://www.gnu.org/licenses/gpl-3.0.txt

В этом руководстве вы также будете использовать файл лицензии BSD. В Linux вы можете скопировать это в свой домашний каталог с помощью следующей команды:

  1. cp /usr/share/common-licenses/BSD .

Если вы находитесь в другой системе, создайте файл с помощью следующей команды:

  1. cat << 'EOF' > BSD
  2. Copyright (c) The Regents of the University of California.
  3. All rights reserved.
  4. Redistribution and use in source and binary forms, with or without
  5. modification, are permitted provided that the following conditions
  6. are met:
  7. 1. Redistributions of source code must retain the above copyright
  8. notice, this list of conditions and the following disclaimer.
  9. 2. Redistributions in binary form must reproduce the above copyright
  10. notice, this list of conditions and the following disclaimer in the
  11. documentation and/or other materials provided with the distribution.
  12. 3. Neither the name of the University nor the names of its contributors
  13. may be used to endorse or promote products derived from this software
  14. without specific prior written permission.
  15. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  16. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  19. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. SUCH DAMAGE.
  26. EOF

Теперь, когда у вас есть файлы, вы можете начать работу с grep.

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

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

  1. grep "GNU" GPL-3

Первый аргумент, GNU, — это шаблон, который вы ищете, а второй аргумент, GPL-3, — это входной файл, который вы хотите найти.

Результатом будет каждая строка, содержащая текст шаблона:

Output
GNU GENERAL PUBLIC LICENSE The GNU General Public License is a free, copyleft license for the GNU General Public License is intended to guarantee your freedom to GNU General Public License for most of our software; it applies also to Developers that use the GNU GPL protect your rights with two steps: "This License" refers to version 3 of the GNU General Public License. 13. Use with the GNU Affero General Public License. under version 3 of the GNU Affero General Public License into a single ... ...

В некоторых системах искомый шаблон будет выделен в выходных данных.

Общие параметры

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

Если вы хотите, чтобы grep игнорировал регистр вашего параметра поиска и выполнял поиск как в верхнем, так и в нижнем регистре, вы можете указать -i или --игнорировать регистр.

Найдите каждый экземпляр слова license (в верхнем, нижнем или смешанном регистре) в том же файле, что и раньше, с помощью следующей команды:

  1. grep -i "license" GPL-3

Результаты содержат: LICENSE, license и License:

Output
GNU GENERAL PUBLIC LICENSE of this license document, but changing it is not allowed. The GNU General Public License is a free, copyleft license for The licenses for most software and other practical works are designed the GNU General Public License is intended to guarantee your freedom to GNU General Public License for most of our software; it applies also to price. Our General Public Licenses are designed to make sure that you (1) assert copyright on the software, and (2) offer you this License "This License" refers to version 3 of the GNU General Public License. "The Program" refers to any copyrightable work licensed under this ... ...

Если бы существовал экземпляр с LiCeNsE, он также был бы возвращен.

Если вы хотите найти все строки, не содержащие указанный шаблон, вы можете использовать параметр -v или --invert-match.

Найдите каждую строку, не содержащую слова the в лицензии BSD, с помощью следующей команды:

  1. grep -v "the" BSD

Вы получите этот вывод:

Output
All rights reserved. Redistribution and use in source and binary forms, with or without are met: may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ... ...

Поскольку вы не указали параметр «игнорировать регистр», последние два элемента были возвращены без слова the.

Часто бывает полезно знать номер строки, в которой происходят совпадения. Это можно сделать с помощью параметра -n или --line-number. Повторно запустите предыдущий пример с добавленным флагом:

  1. grep -vn "the" BSD

Это вернет следующий текст:

Output
2:All rights reserved. 3: 4:Redistribution and use in source and binary forms, with or without 6:are met: 13: may be used to endorse or promote products derived from this software 14: without specific prior written permission. 15: 16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ... ...

Теперь вы можете указать номер строки, если хотите внести изменения в каждую строку, не содержащую the. Это особенно удобно при работе с исходным кодом.

Обычные выражения

Во введении вы узнали, что grep означает \глобальное регулярное выражение печати. \Регулярное выражение — это текстовая строка, описывающая определенный шаблон поиска.

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

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

В предыдущих примерах этого руководства, когда вы искали слова GNU и the, вы на самом деле искали базовые регулярные выражения, которые точно соответствовали строке символов GNU и . Шаблоны, которые точно определяют символы, которые должны сопоставляться, называются литералами, потому что они соответствуют шаблону буквально, символ за символом.

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

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

Якорные совпадения

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

Например, используя якоря, вы можете указать, что хотите знать только те строки, которые соответствуют GNU в самом начале строки. Для этого вы можете использовать привязку ^ перед литеральной строкой.

Выполните следующую команду, чтобы выполнить поиск в файле GPL-3 и найти строки, в которых GNU встречается в самом начале строки:

  1. grep "^GNU" GPL-3

Эта команда вернет следующие две строки:

Output
GNU General Public License for most of our software; it applies also to GNU General Public License, you may choose any version ever published

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

Эта команда будет соответствовать каждой строке, заканчивающейся словом и в файле GPL-3:

  1. grep "and$" GPL-3

Вы получите этот вывод:

Output
that there is no warranty for this free software. For both users' and The precise terms and conditions for copying, distribution and License. Each licensee is addressed as "you". "Licensees" and receive it, in any medium, provided that you conspicuously and alternative is allowed only occasionally and noncommercially, and network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and provisionally, unless and until the copyright holder explicitly and receives a license from the original licensors, to run, modify and make, use, sell, offer for sale, import and otherwise run, modify and

Соответствие любому символу

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

Например, чтобы сопоставить что-либо в файле GPL-3, содержащее два символа, а затем строку cept, вы должны использовать следующий шаблон:

  1. grep "..cept" GPL-3

Эта команда возвращает следующий вывод:

Output
use, which is precisely where it is most unacceptable. Therefore, we infringement under applicable copyright law, except executing it on a tells the user that there is no warranty for the work (except to the License by making exceptions from one or more of its conditions. form of a separately written license, or stated as exceptions; You may not propagate or modify a covered work except as expressly 9. Acceptance Not Required for Having Copies. ... ...

В этом выводе есть экземпляры accept и except, а также варианты этих двух слов. Шаблон также соответствовал бы z2cept, если бы он тоже был найден.

Скобочные выражения

Поместив группу символов в квадратные скобки (\[ и \]), вы можете указать, что символ в этой позиции может быть любым символом, найденным в группе квадратных скобок.

Например, чтобы найти строки, содержащие too или two, вы должны кратко указать эти варианты, используя следующий шаблон:

  1. grep "t[wo]o" GPL-3

Вывод показывает, что в файле существуют оба варианта:

Output
your programs, too. freedoms that you received. You must make sure that they, too, receive Developers that use the GNU GPL protect your rights with two steps: a computer network, with no transfer of a copy, is not conveying. System Libraries, or general-purpose tools or generally available free Corresponding Source from a network server at no charge. ... ...

Обозначение скобок дает вам несколько интересных вариантов. Вы можете сделать так, чтобы шаблон соответствовал чему угодно, кроме символов в скобках, начав список символов в скобках с символа ^.

Этот пример похож на шаблон .ode, но не будет соответствовать шаблону code:

  1. grep "[^c]ode" GPL-3

Вот результат, который вы получите:

Output
1. Source Code. model, to give anyone who possesses the object code either (1) a the only significant mode of use of the product. notice like this when it starts in an interactive mode:

Обратите внимание, что во второй возвращаемой строке действительно есть слово code. Это не ошибка регулярного выражения или grep. Скорее, эта строка была возвращена, потому что ранее в строке был найден шаблон mode, найденный в слове model. Строка была возвращена, потому что был экземпляр, соответствующий шаблону.

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

Это означает, что если вы хотите найти каждую строку, начинающуюся с заглавной буквы, вы можете использовать следующий шаблон:

  1. grep "^[A-Z]" GPL-3

Вот результат, который возвращает это выражение:

Output
GNU General Public License for most of our software; it applies also to States should not allow patents to restrict development and use of License. Each licensee is addressed as "you". "Licensees" and Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an System Libraries, or general-purpose tools or generally available free Source. User Product is transferred to the recipient in perpetuity or for a ... ...

Из-за некоторых устаревших проблем с сортировкой часто более точно использовать классы символов POSIX вместо диапазонов символов, как вы только что использовали.

Обсуждение каждого класса символов POSIX выходит за рамки этого руководства, но в примере, выполняющем ту же процедуру, что и в предыдущем примере, используется класс символов \[:upper:\] в селекторе скобок. :

  1. grep "^[[:upper:]]" GPL-3

Вывод будет таким же, как и раньше.

Повторите шаблон ноль или более раз

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

Чтобы найти каждую строку в файле GPL-3, содержащую открывающую и закрывающую круглую скобку, содержащую только буквы и одиночные пробелы между ними, используйте следующее выражение:

  1. grep "([A-Za-z ]*)" GPL-3

Вы получите следующий результат:

Output
Copyright (C) 2007 Free Software Foundation, Inc. distribution (with or without modification), making available to the than the work as a whole, that (a) is included in the normal form of Component, and (b) serves only to enable use of the work with that (if any) on which the executable work runs, or a compiler used to (including a physical distribution medium), accompanied by the (including a physical distribution medium), accompanied by a place (gratis or for a charge), and offer equivalent access to the ... ...

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

Экранирование метасимволов

Бывают случаи, когда вам нужно искать буквальную точку или буквальную открывающую скобку, особенно при работе с исходным кодом или файлами конфигурации. Поскольку эти символы имеют особое значение в регулярных выражениях, вам нужно «экранировать» эти символы, чтобы сообщить grep, что вы не хотите использовать их особое значение в этом случае.

Вы экранируете символы, используя символ обратной косой черты (\) перед символом, который обычно имеет особое значение.

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

  1. grep "^[A-Z].*\.$" GPL-3

Это результат, который вы увидите:

Output
Source. License by making exceptions from one or more of its conditions. License would be to refrain entirely from conveying the Program. ALL NECESSARY SERVICING, REPAIR OR CORRECTION. SUCH DAMAGES. Also add information on how to contact you by electronic and paper mail.

Теперь давайте посмотрим на другие параметры регулярных выражений.

Расширенные регулярные выражения

Команда grep поддерживает более расширенный язык регулярных выражений, используя флаг -E или вызывая команду egrep вместо grep.

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

Группировка

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

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

  1. grep "\(grouping\)" file.txt
  2. grep -E "(grouping)" file.txt
  3. egrep "(grouping)" file.txt

Чередование

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

Чтобы указать чередование, используйте символ вертикальной черты |. Они часто используются внутри группировки в скобках, чтобы указать, что одна из двух или более возможностей должна считаться совпадением.

Следующее найдет в тексте либо GPL, либо General Public License:

  1. grep -E "(GPL|General Public License)" GPL-3

Вывод выглядит следующим образом:

Output
The GNU General Public License is a free, copyleft license for the GNU General Public License is intended to guarantee your freedom to GNU General Public License for most of our software; it applies also to price. Our General Public Licenses are designed to make sure that you Developers that use the GNU GPL protect your rights with two steps: For the developers' and authors' protection, the GPL clearly explains authors' sake, the GPL requires that modified versions be marked as have designed this version of the GPL to prohibit the practice for those ... ...

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

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

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

Чтобы совпасть с символом ноль или один раз, вы можете использовать символ ?. Это делает символы или наборы символов, которые были раньше, необязательными, по сути.

Следующее соответствует copyright и right, помещая copy в необязательную группу:

  1. grep -E "(copy)?right" GPL-3

Вы получите этот вывод:

Output
Copyright (C) 2007 Free Software Foundation, Inc. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License "Copyright" also means copyright-like laws that apply to other kinds of ...

Символ + соответствует выражению один или несколько раз. Это почти как метасимвол *, но с символом + выражение должно совпадать хотя бы один раз.

Следующее выражение соответствует строке free плюс один или несколько символов, не являющихся пробелами:

  1. grep -E "free[^[:space:]]+" GPL-3

Вы увидите этот вывод:

Output
The GNU General Public License is a free, copyleft license for to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to When we speak of free software, we are referring to freedom, not have the freedom to distribute copies of free software (and charge for you modify it: responsibilities to respect the freedom of others. freedomss that you received. You must make sure that they, too, receive protecting users' freedom to change the software. The systematic of the GPL, as needed to protect the freedom of users. patents cannot be used to render the program non-free.

Указание повторения совпадения

Чтобы указать количество повторений совпадения, используйте фигурные скобки ({ и }). Эти символы позволяют указать точное число, диапазон или верхнюю или нижнюю границу количества совпадений выражения.

Используйте следующее выражение, чтобы найти все строки в файле GPL-3, содержащие тройные гласные:

  1. grep -E "[AEIOUaeiou]{3}" GPL-3

Каждая возвращенная строка содержит слово с тремя гласными:

Output
changed, so that their problems will not be attributed erroneously to authors of previous versions. receive it, in any medium, provided that you conspicuously and give under the previous paragraph, plus a right to possession of the covered work so as to satisfy simultaneously your obligations under this

Чтобы сопоставить любые слова, содержащие от 16 до 20 символов, используйте следующее выражение:

  1. grep -E "[[:alpha:]]{16,20}" GPL-3

Вот вывод этой команды:

Output
certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. c) Prohibiting misrepresentation of the origin of that material, or

Отображаются только строки, содержащие слова указанной длины.

Заключение

grep полезен для поиска шаблонов в файлах или в иерархии файловой системы, поэтому стоит потратить время на ознакомление с его параметрами и синтаксисом.

Регулярные выражения еще более универсальны и могут использоваться во многих популярных программах. Например, многие текстовые редакторы реализуют регулярные выражения для поиска и замены текста.

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