Использование 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 или --ignore-case.

Ищите каждый экземпляр слова 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 и the. Шаблоны, которые точно определяют символы для сопоставления, называются “буквальными”, потому что они сопоставляются с шаблоном буквально, символ за символом.

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

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

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

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

Например, используя якоря, вы можете указать, что вы хотите знать только о строках, которые совпадают с 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

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

Эта команда будет соответствовать каждой строке, заканчивающейся словом and в файле 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 полезен для поиска шаблонов в файлах или в иерархии файловой системы, поэтому стоит потратить время на изучение его параметров и синтаксиса.

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

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

Source:
https://www.digitalocean.com/community/tutorials/using-grep-regular-expressions-to-search-for-text-patterns-in-linux