Как использовать 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” в файле 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

Параметр -i команды grep

Рекурсивное использование 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

Как заставить команду grep работать с несколькими шаблонами поиска

Могут возникнуть ситуации, когда вы захотите найти несколько шаблонов в данном файле (или наборе файлов). В таких случаях следует использовать функцию ‘-e’ опция командной строки, которую предоставляет grep.

Например, если вы хотите найти слова “how”, “to” и “forge” во всех текстовых файлах, находящихся в вашем текущем рабочем каталоге, то вот как это можно сделать:

grep -e how -e to -e forge *.txt

Вот команда в действии:

Множественные шаблоны поиска в Grep

В качестве шаблона поиска в Grep используется ‘-e’ Опция командной строки также помогает в случаях, когда шаблон начинается с дефиса (-). Например, если вы хотите найти, скажем, “-how”, то следующая команда не поможет:

grep -how *.txt

Когда вы используете параметр командной строки -e, команда понимает, что именно вы пытаетесь искать в данном случае:

grep -e -how *.txt

Вот обе команды в действии:

Grep -e switch

Как ограничить вывод grep определенным количеством строк

Если вы хотите ограничить вывод grep определенным количеством строк, вы можете сделать это с помощью опции ‘-m’ параметр командной строки. Например, предположим, что вы хотите найти слово “how” в файле testfile1.txt, который содержит следующие строки:

Ограничение вывода Grep

Но требуется, чтобы grep прекращал поиск после того, как будут найдены 3 строки, содержащие искомый шаблон. Для этого можно выполнить следующую команду:

grep "how" -m3 testfile1.txt

Вот команда в действии:

Grep -m switch

Идем дальше, вот что говорится на 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 optain patterns для файла

Как заставить grep отображать только те строки, которые полностью соответствуют шаблону поиска

До сих пор мы видели, что по умолчанию grep сопоставляет и отображает все строки, содержащие поисковый шаблон. Но если требуется, чтобы grep отображал только те строки, которые полностью соответствуют искомому шаблону, то это можно сделать с помощью параметра командной строки ‘-x’.

Например, предположим, что файл testfile1.txt содержит следующие строки:

Отображать только точные совпадения

А шаблон, который вы хотите найти, – это “How are you?”. Чтобы убедиться, что grep отображает только строки, полностью соответствующие этому шаблону, используйте его следующим образом:

grep -x "how are you?" *.txt

Вот команда в действии:

Переключатель Grep -x в действии

Как заставить grep не отображать ничего в выводе

Бывают ситуации, когда вам не нужно, чтобы команда grep выдавала что-либо на выходе. Вместо этого вы просто хотите знать, было ли найдено совпадение или нет, основываясь на статусе выхода команды. Этого можно добиться с помощью опции командной строки -q.

Хотя опция -q отключает вывод, статус выхода инструмента можно подтвердить командой ‘echo $?’. В случае с grep команда завершается со статусом ‘0’, если она успешна (то есть найдено совпадение), и завершается со статусом ‘1’, если совпадение не найдено.

На следующем снимке экрана показаны успешный и неуспешный сценарии:

Grep не отображает вывод

Как заставить grep отображать имена файлов, не содержащих шаблон поиска

По умолчанию команда grep отображает имена файлов, содержащих шаблон поиска (а также совпадающие строки). Это вполне логично, поскольку именно это ожидается от данного инструмента. Однако бывают случаи, когда требуется получить имена тех файлов, которые не содержат искомый шаблон.

Это также возможно с помощью grep – функция -L Опции позволяют сделать это. Так, например, чтобы найти все те текстовые файлы в текущем каталоге, которые не содержат слова “how”, можно выполнить следующую команду:

grep -L "how" *.txt

Вот команда в действии:

Grep inverse match

Как подавить сообщения об ошибках, выдаваемые grep

При желании вы можете заставить grep отключить все сообщения об ошибках, которые он выводит на экран. Это можно сделать с помощью параметра командной строки -s. Например, рассмотрим следующий сценарий, в котором 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 используется, когда вы хотите, чтобы инструмент отображал в выводе только имена файлов. Например:

Grep нулевое завершение файла

Теперь вы должны знать, что каждое имя в приведенном выше выводе отделяется/заканчивается символом новой строки. Вот как это можно проверить:

Перенаправьте вывод в файл, а затем распечатайте содержимое файла:

Grep -l switch

Итак, вывод команды cat подтверждает наличие символа новой строки между именами файлов.

Но, как вы, возможно, уже знаете, символ новой строки также может быть частью имени файла. Поэтому в случаях, когда имена файлов содержат новую строку и разделены/прерваны новой строкой, работа с выводом grep становится затруднительной (особенно при доступе к выводу через сценарий).

Было бы хорошо, если бы разделительный/завершающий символ не был новой строкой. Вы будете рады узнать, что grep предоставляет опцию командной строки -Z, которая гарантирует, что за именами файлов будет следовать символ NULL, а не новая строка.

Итак, в нашем случае команда выглядит так:

grep -lZ "how" *.txt

Вот как мы подтвердили наличие символа NULL:

Проверка на наличие 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *