Как использовать команду grep в Linux
Изучите основы поиска информации в файлах, а затем загрузите нашу шпаргалку, чтобы получить краткое справочное руководство по grep и регулярным выражениям.
Одной из классических команд Unix, разработанной еще в 1974 году Кеном Томпсоном, является команда Global Regular Expression Print (grep). Он настолько распространен в компьютерных технологиях, что часто используется как глагол («просматривать файл») и, в зависимости от того, насколько фанатична ваша аудитория, он также хорошо вписывается и в реальные сценарии. (Например: «Чтобы восстановить эту информацию, мне придется выполнить grep в своих банках памяти».) Короче говоря, grep — это способ поиска в файле определенного шаблона символов. Если это похоже на современную функцию поиска, доступную в любом текстовом процессоре или текстовом редакторе, то вы уже испытали влияние grep на компьютерную индустрию.
Истинная сила grep заключается не просто в причудливой старой команде, вытесненной современными технологиями, а в двух аспектах:
- Grep работает в терминале и оперирует потоками данных, поэтому вы можете включать его в сложные процессы. Вы можете не только найти слово в текстовом файле; вы можете извлечь слово, отправить его другой команде и так далее.
- Grep использует регулярные выражения для обеспечения гибких возможностей поиска.
Изучить команду grep
несложно, хотя и требует некоторой практики. Эта статья познакомит вас с некоторыми из его функций, которые я считаю наиболее полезными.
[Загрузите нашу бесплатную шпаргалку по grep]
Установка команды grep
Если вы используете Linux, у вас уже установлен grep.
В macOS у вас есть версия grep для BSD. Это немного отличается от версии GNU, поэтому, если вы хотите точно следовать этой статье, установите GNU grep из такого проекта, как Homebrew или MacPorts.
Базовый grep
Основной синтаксис grep всегда один и тот же. Вы предоставляете команде grep
шаблон и файл, в котором вы хотите выполнить поиск. В свою очередь, он выводит каждую строку на ваш терминал с совпадением.
$ grep gnu gpl-3.0.txt
along with this program. If not, see <http://www.gnu.org/licenses/>.
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
По умолчанию команда grep
чувствительна к регистру, поэтому «gnu» отличается от «GNU» или «Gnu». Вы можете заставить его игнорировать заглавные буквы с помощью опции --ignore-case
.
$ grep --ignore-case gnu gpl-3.0.txt
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
[...16 more results...]
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
Вы также можете заставить команду grep
возвращать все строки без совпадений, используя опцию --invert-match
:
$ grep --invert-match \
--ignore-case gnu gpl-3.0.txt
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
[...648 lines...]
Public License instead of this License. But first, please read
Трубы
Возможность находить текст в файле полезна, но истинная сила POSIX заключается в его способности объединять команды через «каналы». Я считаю, что лучше всего использовать grep в сочетании с другими инструментами, такими как Cut, Tr или Curl.
Например, предположим, что у меня есть файл со списком некоторых технических документов, которые я хочу скачать. Я мог бы открыть файл и вручную щелкнуть каждую ссылку, а затем выбрать параметры Firefox, чтобы сохранить каждый файл на свой жесткий диск, но это отнимает много времени и усилий. Вместо этого я мог бы найти ссылки в файле, напечатав только соответствующую строку, используя параметр --only-matching
:
$ grep --only-matching http\:\/\/.*pdf example.html
http://example.com/linux_whitepaper.pdf
http://example.com/bsd_whitepaper.pdf
http://example.com/important_security_topic.pdf
Результатом является список URL-адресов, каждый в одной строке. Это вполне соответствует тому, как Bash обрабатывает данные, поэтому вместо вывода URL-адресов на мой терминал я могу просто передать их в curl
:
$ grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name
При этом каждый файл загружается и сохраняется на моем жестком диске в соответствии с именем удаленного файла.
Мой шаблон поиска в этом примере может показаться загадочным. Это потому, что он использует регулярные выражения, своего рода язык с подстановочными знаками, который особенно полезен при широком поиске в большом количестве текста.
Регулярное выражение
Никто не питает иллюзий, что регулярное выражение (сокращенно «регулярное выражение») — это легко. Тем не менее, я считаю, что у него часто худшая репутация, чем он заслуживает. По общему признанию, у людей есть вероятность стать немного слишком умным с регулярным выражением, пока оно не станет настолько нечитаемым и настолько широким, что сворачивается само по себе, но вам не нужно переусердствовать с регулярным выражением. Вот краткое введение в регулярное выражение, как я его использую.
Сначала создайте файл с именем example.txt
и введите в него этот текст:
Albania
Algeria
Canada
0
1
3
11
Самый простой элемент регулярного выражения — это скромный символ .
. Он представляет собой один символ.
$ grep Can.da example.txt
Canada
Шаблон Can.da
успешно вернул Canada
, поскольку символ .
представляет любой один символ.
Подстановочный знак .
можно изменить для представления более одного символа с помощью следующих обозначений:
?
соответствует предыдущему элементу ноль или один раз*
соответствует предыдущему элементу ноль или более раз+
соответствует предыдущему элементу один или несколько раз{4}
соответствует предыдущему элементу четыре раза (или любое число, которое вы вводите в фигурные скобки)
Вооружившись этими знаниями, вы можете весь день практиковать регулярное выражение на example.txt
, наблюдая, какие интересные комбинации у вас получаются. Некоторые не будут работать; другие будут. Важно проанализировать результаты, чтобы понять, почему.
Для расширенного регулярного выражения требуется опция --extended-regexp или -E.
Например, это не возвращает ни одну страну:
$ grep -E A.a example.txt
Это не удается, поскольку символ .
может соответствовать только одному символу, если вы не повысите его уровень. Используя символ *
, вы можете указать grep
, чтобы он соответствовал одному символу ноль или столько раз, сколько необходимо, пока он не достигнет конца слова. Поскольку вы знаете список, с которым имеете дело, вы знаете, что ноль раз в данном случае бесполезен. В этом списке определенно нет трехбуквенных названий стран. Поэтому вместо этого вы можете использовать +
для сопоставления одного символа хотя бы один раз, а затем столько раз, сколько необходимо, до конца слова:
$ grep -E A.+a example.txt
Albania
Algeria
Вы можете использовать квадратные скобки, чтобы указать список букв:
$ grep -E [AC].+a example.txt
Albania
Algeria
Canada
Это работает и для чисел. Результаты могут Вас удивить:
$ grep [1-9] example.txt
1
3
11
Вы удивлены, увидев 11 в поиске цифр от 1 до 9?
Что произойдет, если вы добавите 13 в свой список?
Эти числа возвращаются, поскольку они включают 1, которая входит в список совпадающих цифр.
Как видите, регулярное выражение — это что-то вроде головоломки, но, экспериментируя и практикуясь, вы можете освоиться с ним и использовать его для улучшения способа поиска данных.
Загрузите шпаргалку
Команда grep
имеет гораздо больше возможностей, чем я продемонстрировал в этой статье. Существуют варианты лучшего форматирования результатов, перечисления файлов и номеров строк, содержащих совпадения, предоставления контекста для результатов путем печати строк, окружающих совпадение, и многое другое. Если вы изучаете grep или просто часто используете его и прибегаете к поиску по его страницам info
, вы окажете себе услугу, загрузив нашу шпаргалку для него. В шпаргалке используются короткие параметры (например, -v
вместо --invert-matching
), чтобы познакомить вас с распространенными сокращениями grep. Он также содержит раздел регулярных выражений, который поможет вам запомнить наиболее распространенные коды регулярных выражений. Загрузите шпаргалку grep сегодня!