Введение
Команда grep
является одной из самых полезных команд в среде терминала Linux. Название grep
расшифровывается как “глобальный вывод регулярного выражения”. Это означает, что вы можете использовать grep
для проверки соответствия ввода, который он получает, заданному шаблону. Эта кажущаяся тривиальная программа является крайне мощной; ее способность сортировать ввод на основе сложных правил делает ее популярным звеном во многих цепочках команд.
В этом руководстве вы изучите параметры команды grep
, а затем погрузитесь в использование регулярных выражений для выполнения более продвинутого поиска.
Предварительные требования
Для следования за этим руководством вам потребуется доступ к компьютеру, работающему под управлением операционной системы на основе Linux. Это может быть виртуальный частный сервер, к которому вы подключились по SSH, или ваш локальный компьютер. Обратите внимание, что это руководство проверено на сервере Linux с установленной Ubuntu 20.04, но приведенные примеры должны работать на компьютере с любой версией любого дистрибутива Linux.
Если вы планируете использовать удаленный сервер для выполнения этого руководства, мы настоятельно рекомендуем вам сначала завершить наше руководство по начальной настройке сервера. Это позволит вам настроить безопасную среду сервера — включая не root пользователя с правами sudo
и настроенный брандмауэр с UFW — которую вы можете использовать для развития ваших навыков работы с Linux.
Основное использование
В этом руководстве вы будете использовать grep
для поиска различных слов и фраз в GNU Общественной Лицензии версии 3.
Если вы используете систему Ubuntu, вы можете найти файл в папке /usr/share/common-licenses
. Скопируйте его в ваш домашний каталог:
Если вы используете другую систему, используйте команду curl
для загрузки копии:
Вы также будете использовать файл лицензии BSD в этом руководстве. На Linux вы можете скопировать его в ваш домашний каталог с помощью следующей команды:
Если вы используете другую систему, создайте файл с помощью следующей команды:
Теперь, когда у вас есть файлы, вы можете начать работу с grep
.
В самой простой форме вы используете grep
для сопоставления буквальных шаблонов в текстовом файле. Это означает, что если вы передадите grep
слово для поиска, он напечатает каждую строку в файле, содержащую это слово.
Выполните следующую команду, чтобы использовать grep
для поиска каждой строки, содержащей слово GNU
:
Первый аргумент, 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
(с учетом верхнего, нижнего регистров или их смешения) в том же файле, что и ранее, с помощью следующей команды:
Результаты содержат: 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, выполняется следующей командой:
Вы получите следующий вывод:
OutputAll 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
. Повторите предыдущий пример с этим флагом:
Это вернет следующий текст:
Output2: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
встречается в начале строки:
Эта команда вернет следующие две строки:
OutputGNU 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
:
Вы получите следующий вывод:
Outputthat 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
, используйте следующий шаблон:
Эта команда вернет следующий вывод:
Outputuse, 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
, вы можете указать эти варианты следующим образом:
Вывод показывает, что оба варианта присутствуют в файле:
Outputyour 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
:
Вот результат, который вы получите:
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
. Строка была возвращена, потому что был найден экземпляр, соответствующий шаблону.
Еще одна полезная функция квадратных скобок заключается в том, что вы можете указать диапазон символов вместо того, чтобы печатать каждый доступный символ по отдельности.
Это означает, что если вы хотите найти каждую строку, начинающуюся с заглавной буквы, вы можете использовать следующий шаблон:
Вот результат выполнения этого выражения:
OutputGNU 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:\]
внутри селектора скобок:
Вывод будет таким же, как и раньше.
Повторение шаблона ноль или более раз
Наконец, один из наиболее часто используемых метасимволов – это звездочка, или *
, что означает «повторите предыдущий символ или выражение ноль или более раз».
Чтобы найти каждую строку в файле 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
, что вы не хотите использовать их специальное значение в данном случае.
Вы экранируете символы, используя обратный слеш (\
) перед символом, который обычно имеет специальное значение.
Например, чтобы найти любую строку, начинающуюся с заглавной буквы и заканчивающуюся точкой, используйте следующее выражение, которое экранирует конечную точку, чтобы она представляла собой буквальную точку, а не обычное значение “любой символ”:
Это будет вывод, который вы увидите:
OutputSource.
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
.
Эти варианты раскрывают возможности “расширенных регулярных выражений”. Расширенные регулярные выражения включают все основные метасимволы, а также дополнительные метасимволы для выражения более сложных совпадений.
Группировка
Одна из самых полезных возможностей, которые открывают расширенные регулярные выражения, – это возможность группировать выражения вместе для их обработки или ссылки как на одну единицу.
Чтобы сгруппировать выражения вместе, заключите их в скобки. Если вы хотите использовать скобки без расширенных регулярных выражений, вы можете экранировать их обратным слешем, чтобы включить эту функциональность. Это означает, что следующие три выражения функционально эквивалентны:
Альтернатива
Подобно тому, как скобочные выражения могут указывать различные возможные варианты для совпадения с одним символом, альтернатива позволяет указывать альтернативные варианты для строк или наборов выражений.
Чтобы указать альтернативу, используйте символ вертикальной черты |
. Они часто используются в скобочных группах, чтобы указать, что один из двух или более вариантов должен считаться совпадением.
Следующее найдет либо GPL
, либо General Public License
в тексте:
Вывод выглядит так:
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
находится в необязательной группе:
Вы получите этот вывод:
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
плюс одному или более символам, которые не являются пробельными символами:
Вы увидите этот вывод:
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
, содержащие тройные гласные:
Каждая возвращенная строка содержит слово с тремя гласными:
Outputchanged, 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, используйте следующее выражение:
Вот результат выполнения этой команды:
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
полезен для поиска шаблонов в файлах или в иерархии файловой системы, поэтому стоит потратить время на изучение его параметров и синтаксиса.
Регулярные выражения еще более гибки, и их можно использовать с многими популярными программами. Например, многие текстовые редакторы реализуют регулярные выражения для поиска и замены текста.
Более того, большинство современных языков программирования используют регулярные выражения для выполнения процедур над определенными частями данных. После того как вы поймете регулярные выражения, вы сможете применять этот опыт к многим обычным компьютерным задачам, начиная от выполнения расширенных поисков в вашем текстовом редакторе и заканчивая проверкой ввода пользователя.