Linux, grep · 10 min read · Sep 12, 2025
Как использовать grep для поиска строк в файлах в оболочке Linux

Команда GREP в Linux - обзор
Команда grep в Linux - это мощная утилита для поиска текста, которая позволяет пользователям искать в файлах или потоках текста определенные шаблоны. Она расшифровывается как “ глобальная печать регулярного выражения“, и поддерживает поиск как по простым текстовым строкам, так и по более сложным регулярным выражениям. Команда часто комбинируется с другими командами для фильтрации и уточнения вывода. По умолчанию grep возвращает все строки, содержащие шаблон. Тем не менее, он предлагает различные опции для настройки поиска, такие как чувствительность к регистру, подсчет вхождений или рекурсивный поиск по каталогам. Это делает его незаменимым инструментом для системных администраторов, разработчиков и всех, кто работает с большими наборами данных в среде, подобной Unix.
Команда grep в основном используется для поиска текста или файла по строкам, которые содержат совпадение с указанными словами/строками. По умолчанию grep отображает совпадающие строки, и его можно использовать для поиска строк текста, которые соответствуют одному или нескольким регулярным выражениям, и он выводит только совпадающие строки.
Предварительные условия
Команда grep является частью базовых утилит любой дистрибуции Linux, поэтому она предустановлена по умолчанию на AlmaLinux, CentOS, Debian, Linux Mint, Ubuntu, RHEL и RockyLinux.
Основной синтаксис команды 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Как использовать команду grep для поиска в файле
В первом примере я буду искать пользователя “tom” в файле passwd Linux. Чтобы найти пользователя “tom” в файле /etc/passwd, вам нужно ввести следующую команду:
grep tom /etc/passwdНиже приведен пример вывода:
tom:x:1000:1000:tom,,,:/home/tom:/bin/bashУ вас есть возможность указать grep игнорировать регистр слов, т.е. совпадать с abc, Abc, ABC и всеми возможными комбинациями с помощью опции -i, как показано ниже:
grep -i "tom" /etc/passwdРекурсивное использование grep
Если у вас есть множество текстовых файлов в иерархии каталогов, например, конфигурационные файлы Apache в /etc/apache2/, и вы хотите найти файл, в котором определен определенный текст, то используйте опцию -r команды grep для выполнения рекурсивного поиска. Это выполнит рекурсивный поиск по файлам для строки “197.167.2.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") {Использование grep для поиска только слов
Когда вы ищете abc, grep будет совпадать со всеми возможными вариантами, т.е. kbcabc, abc123, aarfbc35 и многими другими комбинациями, не соблюдая границы слов. Вы можете заставить команду grep выбирать только те строки, которые содержат совпадения с целыми словами (те, которые совпадают только с abc), как показано ниже:
grep -w "abc" file.txtПример:

Использование grep для поиска двух разных слов
Чтобы искать два разных слова, вы должны использовать команду egrep, как показано ниже:
egrep -w 'word1|word2' /path/to/fileПодсчет строк для совпадающих слов
Команда grep имеет возможность сообщать о количестве раз, когда определенный шаблон был найден для каждого файла, используя опцию -c (count) (как показано ниже):
grep -c 'word' /path/to/fileКроме того, пользователи могут использовать опцию ‘-n’, предшествующую каждой выходной строке с номером строки в текстовом файле, из которого она была получена (как показано ниже):
grep -n 'root' /etc/passwdНиже приведены примеры вывода:
1:root:x:0:0:root:/root:/bin/bash
Обратное совпадение grep
Пользователи могут использовать опцию -v, чтобы вывести инвертированное совпадение, что означает, что она будет совпадать только с теми строками, которые не содержат данное слово. Например, выведите все строки, которые не содержат слово par, используя следующую команду:
grep -v par /path/to/fileКак перечислить только имена совпадающих файлов
Вы должны использовать опцию -l, чтобы перечислить имена файлов, содержимое которых упоминает определенное слово, например, слово ‘primary’, используя следующую команду:
grep -l 'primary' *.cНаконец, у вас есть возможность заставить grep отображать вывод в определенных цветах, используя следующую команду:
grep --color root /etc/passwdНиже приведены примеры вывода:
Как заставить команду grep обрабатывать несколько шаблонов поиска
Могут быть ситуации, когда вы хотите искать несколько шаблонов в данном файле (или наборе файлов). В таких сценариях вы должны использовать командную опцию ‘-e‘, которую предоставляет grep.
Например, предположим, что вы хотите искать слова “how”, “to” и “forge” во всех текстовых файлах, находящихся в вашем текущем рабочем каталоге, тогда вот как вы можете это сделать:
grep -e how -e to -e forge *.txtВот команда в действии:
Командная опция ‘-e‘ также помогает в ситуациях, когда шаблон начинается с дефиса (-). Например, если вы хотите искать, скажем, “-how”, тогда следующая команда не будет полезной:
grep -how *.txtКогда вы используете командную опцию -e, команда понимает, что именно вы пытаетесь искать в этом случае:
grep -e -how *.txtВот обе команды в действии:
Как ограничить вывод grep определенным количеством строк
Если вы хотите ограничить вывод grep определенным количеством строк, вы можете сделать это, используя командную опцию ‘-m‘. Например, предположим, что вы хотите искать слово “how” в testfile1.txt, который содержит следующие строки:
Но требование состоит в том, чтобы grep остановил поиск после того, как будет найдено 3 строки, содержащие искомый шаблон. Итак, чтобы сделать это, вы можете выполнить следующую команду:
grep "how" -m3 testfile1.txtВот команда в действии:
Далее, вот что говорит страница man для команды:
Если ввод является стандартным вводом из обычного файла, и NUM совпадающих строк выводится, grep гарантирует, что стандартный ввод будет расположен сразу после последней совпадающей строки перед выходом, независимо от наличия последующих строк контекста. Это позволяет вызывающему процессу возобновить поиск.Таким образом, например, если у вас есть bash-скрипт, который имеет цикл, и вы хотите получить одно совпадение за итерацию цикла, то использование ‘grep -m1’ сделает необходимое.
Как заставить grep получать шаблоны из файла
Если вы хотите, вы также можете заставить команду grep получать шаблоны из файла. Командная опция -f инструмента позволяет вам это сделать.
Например, предположим, что вы хотите искать все .txt файлы в текущем каталоге для слов “how” и “to”, но хотите предоставить эти входные строки через файл с именем, скажем, “input”, тогда вот как вы можете это сделать:
grep -f input *.txtВот команда в действии:
Как заставить grep отображать только те строки, которые полностью соответствуют шаблону поиска
До сих пор мы видели, что по умолчанию grep совпадает и отображает полные строки, содержащие шаблоны поиска. Но если требование состоит в том, чтобы заставить grep отображать только те строки, которые полностью соответствуют искомому шаблону, то это можно сделать с помощью командной опции ‘-x’.
Например, предположим, что файл testfile1.txt содержит следующие строки:
И шаблон, который вы хотите искать, это “how are you?”. Чтобы убедиться, что grep отображает только строки, которые полностью соответствуют этому шаблону, используйте его следующим образом:
grep -x "how are you?" *.txtВот команда в действии:
Как заставить grep не отображать ничего в выводе
Могут быть ситуации, когда вам не нужно, чтобы команда grep производила что-либо в выводе. Вместо этого вы просто хотите знать, было ли найдено совпадение на основе статуса выхода команды. Это можно достичь с помощью командной опции -q.
Хотя опция -q подавляет вывод, статус выхода инструмента можно подтвердить с помощью команды ‘echo $?’. В случае grep команда завершает работу со статусом ‘0’, когда она успешна (что означает, что совпадение было найдено), в то время как она завершает работу со статусом ‘1’, когда совпадение не было найдено.
Следующий скриншот показывает как успешные, так и неуспешные сценарии:

Как заставить grep отображать имена файлов, которые не содержат шаблон поиска
По умолчанию команда grep отображает имена файлов, содержащих шаблон поиска (а также совпадающие строки). Это вполне логично, так как именно этого ожидается от этого инструмента. Однако могут быть случаи, когда требование может заключаться в том, чтобы получить имена тех файлов, которые не содержат искомый шаблон.
Это также возможно с помощью grep - опция -L позволяет вам это сделать. Таким образом, например, чтобы найти все текстовые файлы в текущем каталоге, которые не содержат слово “how”, вы можете выполнить следующую команду:
grep -L "how" *.txtВот команда в действии:
Как подавить сообщения об ошибках, выданные grep
Вы можете заставить grep подавить любые сообщения об ошибках, которые он отображает в выводе, если хотите. Это можно сделать с помощью командной опции -s. Например, рассмотрим следующий сценарий, в котором grep выдает ошибку/предупреждение, связанное с каталогом, с которым он сталкивается:
Таким образом, в таком сценарии помогает командная опция -s. Смотрите ниже.
Таким образом, вы можете видеть, что ошибка/предупреждение было подавлено.
Как заставить grep рекурсивно искать по каталогам
Как видно из примера, использованного в предыдущем пункте, команда grep по умолчанию не выполняет рекурсивный поиск. Чтобы убедиться, что ваш поиск grep является рекурсивным, используйте командную опцию -d и передайте ей значение ‘recurse’.
grep -d recurse "how" *Примечание 1 : Сообщение об ошибке/предупреждении, связанное с каталогом, которое мы обсуждали в предыдущем пункте, также можно подавить с помощью опции -d - все, что вам нужно сделать, это передать значение ‘skip’ ей.
Примечание 2 : Используйте опцию ‘–exclude-dir=[DIR]’, чтобы исключить каталоги, соответствующие шаблону DIR, из рекурсивных поисков.
Как заставить grep завершать имена файлов с символом NULL
Как мы уже обсуждали, командная опция -l grep используется, когда вы хотите, чтобы инструмент отображал только имена файлов в выводе. Например:
Теперь вы должны знать, что каждое имя в приведенном выше выводе разделяется/завершается символом новой строки. Вот как вы можете это проверить:
Перенаправьте вывод в файл, а затем распечатайте содержимое файла:
Таким образом, вывод команды cat подтверждает наличие символа новой строки между именами файлов.
Но, как вы, возможно, уже знаете, символ новой строки также может быть частью имени файла. Поэтому, когда дело доходит до случаев, когда имена файлов содержат новую строку и разделены/завершаются новой строкой, становится сложно работать с выводом grep (особенно при доступе к выводу через скрипт).
Было бы хорошо, если бы разделяющий/завершающий символ не был новой строкой. Что ж, вы будете рады узнать, что grep предоставляет командную опцию -Z, которая гарантирует, что имена файлов следуют за символом NULL, а не за новой строкой.
Таким образом, в нашем случае команда становится:
grep -lZ "how" *.txtВот как мы подтвердили наличие символа NULL:
Следующая связанная командная опция, которую вы должны знать:
-z, --null-data
Обрабатывайте ввод как набор строк, каждая из которых завершается нулевым байтом (ASCII NUL), а не новой строкой. Как и опция -Z или --null, эта опция может быть использована с командами, такими как sort -z, для обработки произвольных имен файлов.Как использовать GREP для поиска ошибок в лог-файлах
Grep - это швейцарский армейский нож администратора Linux, когда дело доходит до отладки ошибок в службах. Большинство служб Linux имеют лог-файлы, в которых они сообщают об ошибках. Эти лог-файлы могут быть огромными, и grep - это универсальная и быстрая команда для поиска, например, IP-адреса подключающейся системы, строки ошибки или адреса электронной почты затронутого почтового пользователя в mail.log.
Примеры:
Искать подключения, связанные с определенным адресом электронной почты. Здесь ‘ [email protected] ‘ находится в лог-файле сервера mail.log.
grep [email protected] /var/log/mail.logРезультат:
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17596, TLS, session=<3uoa5ffQovld3Uep>
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17596><3uoa5ffQovld3Uep>: Disconnected: Logged out top=0/0, retr=1/6647, del=1/1, size=6630
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17673, TLS, session=
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17673>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17868, TLS, session=
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17868>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17964, TLS, session=
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17964>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Aug 22 09:45:10 mail postfix/smtpd[6932]: NOQUEUE: reject: RCPT from unknown[1.2.3.4]: 504 5.5.2 <1.2.3.4>: Helo command rejected: need fully-qualified hostname; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<1.2.3.4> Чтобы непрерывно отслеживать лог-файл на предмет подключений для этого адреса электронной почты, объедините команды tail и grep следующим образом:
tail -f /var/log/mail.log | grep [email protected]Чтобы выйти из функции наблюдения, нажмите клавиши [strg] + c.
Дополнительные примеры команды GREP
Вы можете найти еще больше примеров использования этой команды Linux в нашем втором учебнике по команде GREP.
- Как выполнять поиск шаблонов в файлах с помощью Grep
Get new posts in your inbox
No spam. Unsubscribe anytime.