Команда grep, которая означает global regular expression print (печать глобального регулярного выражения) , является одной из самых универсальных команд в терминальной среде Linux. Это чрезвычайно мощная программа, которая позволяет пользователю сортировать ввод в соответствии со сложными правилами, что делает ее довольно популярным звеном в многочисленных цепочках команд. Команда grep в основном используется для поиска в тексте или файле строк, содержащих совпадения с указанными словами / строками. По умолчанию grep отображает совпавшие строки, и его можно использовать для поиска строк текста, соответствующкго регулярному выражению.
1. Базовый синтаксис команды grep
Базовый синтаксис команды grep следующий:
grep 'word' filename
grep 'word' file1 file2 file3
grep 'string1 string2' filename
cat otherfile | grep 'something'
command | grep 'something'
command option1 | grep 'data'
grep --color 'data' fileName
2. Как использовать команду grep для поиска в файле
В первом примере я буду искать пользователя «tom» в файле passwd Linux. Для поиска пользователя «vasya» в файле /etc/passwd необходимо ввести следующую команду:
grep vasya /etc/passwd
Ниже приведен пример вывода:
vasya:x:1001:1001:,,,:/home/vasya:/bin/bash
У вас есть возможность указать grep игнорировать регистр слов, то есть сопоставить abc, Abc, ABC и все возможные комбинации с параметром -i, как показано ниже:
grep -i "Vasya" /etc/passwd
3. Рекурсивное использование grep
Если у вас есть куча текстовых файлов в иерархии каталогов, например файлы конфигурации Apache в /etс/apache2/, и вы хотите найти файл, в котором определен конкретный текст, то используйте параметр -r команды grep, чтобы выполнить рекурсивный поиск. Это выполнит рекурсивную операцию поиска по файлам для строки «192.168.10.9» (как показано ниже) в каталоге /etc/apache2/ и во всех его подкаталогах:
grep -r "mydomain.com" /etc/apache2/
В качестве альтернативы можно использовать следующую команду:
grep -R "mydomain.com" /etc/apache2/
Ниже приведены примеры результатов аналогичного поиска на сервере Nginx:
grep -r "mydomain.com" /etc/nginx/
/etc/nginx/sites-available/mydomain.com.vhost: if ($http_host != "www.mydomain.com") {
Здесь вы увидите результат для mydomain.com в отдельной строке, которой предшествует имя файла (например, /etc/nginx/sites-available/mydomain.com.vhost), в котором он был найден. Включение имен файлов в выходные данные можно легко подавить с помощью параметра -h (как описано ниже): grep -h -R “mydomain.com” /etc/nginx/
Ниже приведен пример вывода:
grep -r "mydomain.com" /etc/nginx/
if ($http_host != "www.mydomain.com") {
4. Использование grep для поиска только слов
Когда вы ищете abc, grep будет выводить все найленные совпадения, а именно kbcabc, abc123, aarfbc35 и тому подобное, не подчиняясь границам слов. Вы можете заставить команду grep выбирать только те строки, которые содержат целые слова (тех, которые соответствуют только слову abc), как показано ниже:
grep -w "abc" file.txt
5. Использование grep для поиска двух разных слов
Чтобы найти два разных слова, вы должны использовать команду egrep, как показано ниже:
egrep -w 'word1|word2' /path/to/file
6. Подсчет строк для совпадающих слов
Команда grep может сообщать, сколько раз конкретный шаблон был сопоставлен для каждого файла, используя параметр -c (count) (как показано ниже):
grep -c 'word'/path/to/file
Кроме того, пользователи могут использовать опцию ‘-n’ перед каждой выходной строкой с номером строки в текстовом файле, из которого она была получена (как показано ниже):
grep -n 'word' file2.txt
7.Инвертирование совпадения
Пользователи могут использовать параметр -v для печати инвертирования совпадения, что означает, что совпадение будет соответствовать только тем строкам, которые не содержат данное слово. Например, нужно вывести все строки, которые не содержат слова vasya:
grep -v vasya /path/to/file
8. Как вывести только имена совпадающих файлов
Чтобы вывести список имен файлов, в содержании которых упоминается определенное слово, нужно использовать параметр -l. Например, найдем файлы с расширением .txt, содержащие слово «word2», с помощью следующей команды:
grep -l 'word2' *.txt
9. Как заставить команду grep обрабатывать несколько шаблонов поиска
Могут возникнуть ситуации, когда вы захотите выполнить поиск по нескольким шаблонам в файле (или наборе файлов). В таких сценариях следует использовать параметр командной строки ‘ -e’ .
Предположим, что вы хотите искать слова «как», «к» и «ковать» во всех текстовых файлах, имеющихся в вашем текущем рабочем каталоге, тогда вот как вы можете это сделать:
grep -e aaa -e bbb -e ccc *.txt
Вот команда в действии:
Параметр командной строки « -e» также помогает в сценариях, в которых шаблон начинается с дефиса (-). Например, если вы хотите найти, скажем, “-zyx”, то следующая команда не поможет:
grep -zyx *.txt
Когда вы используете параметр командной строки -e, команда понимает, что именно вы пытаетесь найти в этом случае:
grep -e -zyx *.txt
Вот обе команды в действии:
10. Как ограничить вывод grep определенным количеством строк
Если вы хотите ограничить вывод grep определенным количеством строк, вы можете сделать это с помощью параметра командной строки ‘ -m’ . Например, предположим, что вы хотите найти слово «word» в file3.txt, которое содержит следующие строки:
Требуется, чтобы grep прекратил поиск после того, как были найдены 3 строки, содержащие искомый шаблон. Итак, для этого вы можете выполнить следующую команду:
grep "word -m3 file3.txt
Вот результат:
11. Как заставить grep получать шаблоны из файла
Вы также можете заставить команду grep получать шаблоны поиска из файла. Параметр командной строки инструмента -f позволяет это сделать.
Например, предположим, что вы хотите найти во всех файлах .txt в текущем каталоге слова «aaa» и «abc», но хотите передать эти входные строки через файл с именем, скажем, «input», тогда вот как вы можете сделай это:
grep -f input *.txt
Вот команда в действии:
12. Как заставить grep отображать только те строки, которые полностью соответствуют шаблону поиска
До сих пор мы видели, что по умолчанию grep соответствует и отображает полные строки, содержащие шаблоны поиска. Но если требуется, чтобы grep отображал только те строки, которые полностью соответствуют искомому шаблону, то это можно сделать с помощью параметра командной строки ‘-x’.
Например, предположим, что файл file.txt содержит следующие строки:
И шаблон, который вы хотите найти, – это «how are you?». Поэтому, чтобы убедиться, что grep отображает только строки, полностью соответствующие этому шаблону, используйте его следующим образом:
grep -x "how are you?" *.txt
Вот команда в действии:
13. Как заставить grep ничего не отображать в выводе
Могут возникнуть ситуации, когда вам не понадобится команда grep для вывода каких-либо данных. Вместо этого вы просто хотите знать, было ли найдено совпадение на основе статуса выхода команды. Этого можно добиться с помощью параметра командной строки -q.
В то время как опция -q отключает вывод, статус выхода инструмента может быть подтвержден с помощью команды ‘echo $?’. Команда завершается со статусом «0», когда она успешна (то есть совпадение было найдено), либо завершается со статусом «1», когда совпадение найдено не было.
На следующем снимке экрана показаны как успешные, так и неудачные сценарии:
14. Как заставить grep отображать имя файлов, которые не содержат шаблон поиска
По умолчанию команда grep отображает имена файлов, содержащих шаблон поиска (а также совпадающие строки). Это вполне логично, ведь именно этого и следовало ожидать от этого инструмента. Однако могут быть случаи, когда требуется получить имена тех файлов, которые не содержат искомый шаблон.
Это также возможно с помощью grep – параметры -L позволяют это сделать. Так, например, чтобы найти все те текстовые файлы в текущем каталоге, которые не содержат слова «how», вы можете выполнить следующую команду:
grep -L "how" *.txt
Вот команда в действии:
15. Как подавить сообщения об ошибках, создаваемые grep
При желании вы также можете заставить grep отключать все сообщения об ошибках, отображаемые в выводе. Это можно сделать с помощью параметра командной строки -s. Например, рассмотрим следующий сценарий, в котором grep выдает ошибку / предупреждение, относящееся к каталогу, с которым он сталкивается:
Подавить ошибки в grep
В таком случае помогает опция командной строки -s. См. ниже.
Переключатель grep -s
Итак, вы можете видеть, что сообщение об ошибке / предупреждении отключено.
16. Как сделать так, чтобы grep рекурсивно выполнял поиск по каталогам
Как видно из примера, использованного в предыдущем пункте, команда grep по умолчанию не выполняет рекурсивный поиск. Чтобы убедиться, что ваш поиск grep является рекурсивным, используйте параметр командной строки -d и передайте ему значение «recurse».
grep -d recurse "word" *
Примечание 1. Сообщение об ошибке / предупреждении, связанное с каталогом, которое мы обсуждали в предыдущем пункте, также можно отключить с помощью параметра -d – все, что вам нужно сделать, это передать ему значение «recurse».
Примечание 2. Используйте параметр –exclude -dir = [DIR] ‘, чтобы исключить каталоги, соответствующие шаблону DIR, из рекурсивного поиска.
17. Как заставить grep завершать имена файлов символом NULL
Как мы уже обсуждали, параметр командной строки -l команды grep используется, когда вы хотите, чтобы инструмент отображал только имена файлов в выводе. Например:
Теперь вы должны знать, что каждое имя в приведенном выше выводе отделяется / заканчивается символом новой строки. Вот как вы можете это проверить:
Перенаправьте вывод в файл, а затем распечатайте содержимое файла:
Таким образом, вывод команды cat подтверждает наличие символа новой строки между именами файлов.
Но, как вы, возможно, уже знаете, символ новой строки также может быть частью имени файла. Поэтому, когда речь идет о случаях, когда имена файлов содержат новую строку, и они также разделяются / завершаются новой строкой, становится сложно работать с выводом grep (особенно при доступе к выводу через скрипт).
Было бы хорошо, если бы разделительный / завершающий символ не был новой строкой. Что ж, grep предоставляет параметр командной строки -Z, который следит за тем, чтобы имена файлов сопровождались символом NULL, а не символом новой строки.
Итак, в нашем случае команда выглядит так:
grep -lZ "word" *.txt
Вот как мы подтвердили наличие символа NULL:
Ниже приведен соответствующий параметр командной строки, который вам следует знать:
-z, --null-data
Treat the input as a set of lines, each terminated by a zero byte (the ASCII NUL character) insteadof a newline. Like the -Z or --null option, this option can be used with commands like sort -z to process arbitrary file names.
Рассматривайте ввод как набор строк, каждая из которых заканчивается нулевым байтом (символ ASCII NUL) вместо новой строки. Как и параметр -Z или –null, этот параметр можно использовать с такими командами, как sort -z, для обработки произвольных имен файлов.