Как использовать grep для поиска строк в файлах в оболочке Linux
Команда GREP — обзор
Команда grep, что означает глобальная печать регулярных выражений, является одной из наиболее универсальных команд в терминальной среде Linux. Grep — чрезвычайно мощная программа, которая позволяет пользователю выбирать и сортировать вводимые данные по сложным правилам, что делает ее очень популярной частью многочисленных командных цепочек.
Команда grep в основном используется для поиска в тексте или файле строк, содержащих совпадения с указанными словами/строками. По умолчанию grep отображает совпадающие строки и может использоваться для поиска строк текста, соответствующих одному или нескольким регулярным выражениям, и выводит только совпавшие строки.
Предварительные условия
Команда grep является частью базовых утилит любого дистрибутива Linux, поэтому по умолчанию она предустановлена в любом дистрибутиве 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. Чтобы найти файл /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 (счетчик) (как показано ниже):
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 для вывода списка имен файлов, в содержимом которых упоминается определенное слово, например слово «основной», с помощью следующей команды:
grep -l 'primary' *.c
Наконец, у вас есть возможность заставить grep отображать выходные данные в определенных цветах, используя следующую команду:
grep --color root /etc/passwd
Ниже приведены примеры результатов:
Как заставить команду grep обрабатывать несколько шаблонов поиска
Могут возникнуть ситуации, когда вам может потребоваться выполнить поиск по нескольким шаблонам в данном файле (или наборе файлов). В таких сценариях вам следует использовать параметр командной строки '-e', предоставляемый grep.
Например, предположим, что вы хотите найти слова «как», «чтобы» и «подделать» во всех текстовых файлах, присутствующих в вашем текущем рабочем каталоге, тогда вот как вы можете это сделать:
grep -e how -e to -e forge *.txt
Вот команда в действии:
Параметр командной строки «-e» также помогает в случаях, когда шаблон начинается с дефиса (-). Например, если вы хотите найти, скажем, «-how», то следующая команда не поможет:
grep -how *.txt
Когда вы используете опцию командной строки -e, команда понимает, что именно вы пытаетесь найти в этом случае:
grep -e -how *.txt
Вот обе команды в действии:
Как ограничить вывод grep определенным количеством строк
Если вы хотите ограничить вывод grep определенным количеством строк, вы можете сделать это, используя параметр командной строки '-m'. Например, предположим, что вы хотите найти слово «как» в файле testfile1.txt, который содержит следующие строки:
Но требуется, чтобы grep прекратил поиск после того, как были найдены 3 строки, содержащие искомый шаблон. Итак, для этого вы можете запустить следующую команду:
grep "how" -m3 testfile1.txt
Вот команда в действии:
Двигаясь дальше, вот что говорит справочная страница команды:
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 в текущем каталоге слова «как» и «кому», но хотите передать эти входные строки через файл с именем, скажем, «вход», тогда вот как вы можете это сделать. сделай это:
grep -f input *.txt
Вот команда в действии:
Как заставить grep отображать только те строки, которые полностью соответствуют шаблону поиска
До сих пор мы видели, что по умолчанию grep находит и отображает полные строки, содержащие шаблоны поиска. Но если требуется, чтобы grep отображал только те строки, которые полностью соответствуют искомому шаблону, то это можно сделать с помощью параметра командной строки '-x'.
Например, предположим, что файл testfile1.txt содержит следующие строки:
И шаблон, который вы хотите найти, — «как дела?». Поэтому, чтобы убедиться, что grep отображает только те строки, которые полностью соответствуют этому шаблону, используйте его следующим образом:
grep -x "how are you?" *.txt
Вот команда в действии:
Как заставить grep ничего не отображать на выходе
Могут возникнуть ситуации, когда вам не нужна команда grep для вывода чего-либо. Вместо этого вы просто хотите узнать, было ли найдено совпадение на основе статуса завершения команды. Этого можно добиться с помощью параметра командной строки -q.
Хотя опция -q отключает вывод, статус выхода инструмента можно подтвердить с помощью команды «echo $?». команда. В случае grep команда завершает работу со статусом «0» в случае успеха (то есть совпадение найдено) и завершает работу со статусом «1», если совпадение не найдено.
На следующем снимке экрана показаны как успешные, так и неудачные сценарии:
Как заставить grep отображать имена файлов, которые не содержат шаблон поиска
По умолчанию команда grep отображает имена файлов, содержащих шаблон поиска (а также совпадающие строки). Это вполне логично, поскольку именно этого и ожидали от этого инструмента. Однако могут быть случаи, когда потребуется получить имена тех файлов, которые не содержат искомый шаблон.
Это также возможно с помощью grep — параметры -L позволяют это сделать. Так, например, чтобы найти в текущем каталоге все те текстовые файлы, которые не содержат слова «как», вы можете запустить следующую команду:
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 » в файле mail.log сервера.
grep [email /var/log/mail.log
Результат :
Nov 17 09:33:22 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17596, TLS, session=<3uoa5ffQovld3Uep>
Nov 17 09:33:23 mail dovecot: pop3([email )<17596><3uoa5ffQovld3Uep>: Disconnected: Logged out top=0/0, retr=1/6647, del=1/1, size=6630
Nov 17 09:34:14 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17673, TLS, session=<fIIx6PfQkuBd3Uep>
Nov 17 09:34:14 mail dovecot: pop3([email )<17673><fIIx6PfQkuBd3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Nov 17 09:35:40 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17868, TLS, session=<bd5L7ffQPsld3Uep>
Nov 17 09:35:40 mail dovecot: pop3([email )<17868><bd5L7ffQPsld3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Nov 17 09:35:58 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17964, TLS, session=<sbpn7vfQevpd3Uep>
Nov 17 09:35:58 mail dovecot: pop3([email )<17964><sbpn7vfQevpd3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Nov 17 09:36:16 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 > to=<[email > proto=ESMTP helo=<1.2.3.4>
Чтобы постоянно отслеживать файл журнала на предмет соединений для этого адреса электронной почты, объедините команды Tail и Grep следующим образом:
tail -f /var/log/mail.log | grep [email
Чтобы выйти из функции часов, нажмите клавиши [strg] + c.
Дополнительные примеры команд GREP
В нашем втором руководстве по командам GREP вы можете найти еще больше примеров использования этой команды Linux.
- Как выполнить поиск по шаблону в файлах с помощью Grep