Команда 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” в файле Linux passwd. Чтобы выполнить поиск в /etc/passwd файл для пользователя “tom”, необходимо ввести следующую команду:
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 invert match
Пользователи могут использовать опцию -v, чтобы вывести инвертированное соответствие, то есть только те строки, которые не содержат заданного слова. Например, выведите все строки, не содержащие слово par, с помощью следующей команды:
grep -v par /path/to/file
Как вывести список только имен совпадающих файлов
Чтобы перечислить имена файлов, в содержимом которых упоминается определенное слово, например слово ‘primary’, используйте параметр -l, выполнив следующую команду:
grep -l 'primary' *.c
Наконец, у вас есть возможность заставить grep отображать вывод в определенных цветах, используя следующую команду:
grep --color root /etc/passwd
Ниже приведены примеры вывода:
Как заставить команду grep работать с несколькими шаблонами поиска
Могут возникнуть ситуации, когда вы захотите найти несколько шаблонов в данном файле (или наборе файлов). В таких случаях следует использовать функцию ‘-e’ опция командной строки, которую предоставляет grep.
Например, если вы хотите найти слова “how”, “to” и “forge” во всех текстовых файлах, находящихся в вашем текущем рабочем каталоге, то вот как это можно сделать:
grep -e how -e to -e forge *.txt
Вот команда в действии:
В качестве шаблона поиска в Grep используется ‘-e’ Опция командной строки также помогает в случаях, когда шаблон начинается с дефиса (-). Например, если вы хотите найти, скажем, “-how”, то следующая команда не поможет:
grep -how *.txt
Когда вы используете параметр командной строки -e, команда понимает, что именно вы пытаетесь искать в данном случае:
grep -e -how *.txt
Вот обе команды в действии:
Как ограничить вывод grep определенным количеством строк
Если вы хотите ограничить вывод grep определенным количеством строк, вы можете сделать это с помощью опции ‘-m’ параметр командной строки. Например, предположим, что вы хотите найти слово “how” в файле testfile1.txt, который содержит следующие строки:
Но требуется, чтобы grep прекращал поиск после того, как будут найдены 3 строки, содержащие искомый шаблон. Для этого можно выполнить следующую команду:
grep "how" -m3 testfile1.txt
Вот команда в действии:
Идем дальше, вот что говорится на man-странице команды:
If the input is standard input from a regular file, and NUM matching lines are output, grep ensuresthat the standard input is positioned to just after the last matching line before exiting, regardless of the presence of trailing context lines. This enables a calling process to resume a search.
Например, если у вас есть 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 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.
Как использовать 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= Aug 22 09:45:10 mail dovecot: pop3([email protected]): 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]): 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]): 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]): 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 : Helo command rejected: need fully-qualified hostname; from=[email protected]> to=[email protected]> proto=ESMTP helo=
Чтобы постоянно отслеживать файл журнала на предмет соединений для этого адреса электронной почты, объедините команды tail и grep следующим образом:
tail -f /var/log/mail.log | grep [email protected]
Чтобы выйти из функции наблюдения, нажмите [strg] + клавиши c.