Использование утилиты grep для поиска в Linux

grep — консольная утилита nix систем, позволяющая искать файл\файлы по шаблонам(регулярным выражениям) в файловой системе, фильтровать вывод других команд.
Регулярные выражения (regexp) – механизм поиска информации по в заранее заданным шаблонам в соответствии с определенными правилами.

Ознакомиться с тарифами для VPS хостинга можно тут

Подготовка

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

grep

Если вывод выглядит следующим образом, то пакет уже установлен

root@localhost:# grep
Usage: grep [OPTION]... PATTERNS [FILE]...
Try 'grep --help' for more information.
root@localhost:#

Установить grep можно через пакетный менеджер
Ubuntu, Debian
apt update && apt upgrade && apt install grep

Для RPM-подобных систем
dnf update && dnf upgrade && dnf install grep

Синтаксис и опции

Для поиска используется сама команда grep, а так же основные опции, которые и образуют синтаксис команды:
grep [options] [pattern] [path to file]

Для простого поиска по шаблону в файле используем команду:
grep 'GET' /var/log/nginx/nginx.log

Вывод команды:

root@localhost:# grep 'GET' /var/log/nginx/nginx.log
8.8.8.8 - - [08/Jul/2024:13:02:35 +0300] "GET / HTTP/1.1" 301 169 "-" "HTTP Banner Detection (https://security.ipip.net)" "-"
root@localhost:#

В заданном файле был найден и подсвечен запрашиваемый шаблон, в данном случае использовались два основных блока синтаксиса [pattern] и [path to file] без [options].
Если нам необходимо выполнить более сложный поиск с учетом нескольких условий, то для этого и существует целый список опций [options].
Рассмотрим основные опции и приведем пример их использования:

Настройка сопоставления шаблонов:
-E, –extended-regexp Расширенные регулярки для шаблонов
-G, –basic-regexp Стандартные регулярки для шаблонов
-P, –perl-regexp Использование регулярки-perl

Источники шаблонов:
-e, –regexp= [шаблон] позволяет задать паттерн напрямую;
-f, –file=[файл] позволяет задать паттерн напрямую.

Управление регистром:
-i, –ignore-case Без учета регистра про поиске соответствия;
–no-ignore-case C учетом регистра про поиске соответствия, работает по-умолчанию.

Специальные режимы сопоставления:
-w, –word-regexp Учитывать при сопоставлении, только целые слова;
-x, –line-regexp Учитывать при сопоставлении, только целые строки.

Альтернативное окончание строки:
-z, –null-data Считать конец строки нулевым байтом вместо символа новой строки.

Все эти группы опций относятся к конфигурации способа сопоставления шаблона с массивом данных.
Для чуть более сложного поиска, чем в первом примере, будем использовать обычные регулярные выражения.

Для простого поиска по шаблону в файле используем команду:
grep -e 'Ban' /var/log/nginx/nginx.log
Вывод команды:
root@localhost:# grep -e 'Ban' /var/log/nginx/nginx.log
8.8.8.8 - - [08/Jul/2024:13:02:35 +0300] "GET / HTTP/1.1" 301 169 "-" "HTTP Banner Detection (https://security.ipip.net)" "-"
root@localhost:#

Для того, что бы найти именно необходимое слово используем опцию -w, она позволит разбить предложения по словам, а не по символам в них:
grep -w -e 'Ban' /var/log/nginx/nginx.log
Вывод команды:
root@localhost:# grep -w -e 'Ban' /var/log/nginx/nginx.log
root@localhost:#

Если указать слово, а не его часть, то строка будет найдена:
grep -w -e 'Banner' /var/log/nginx/nginx.log
Вывод команды:
root@localhost:# grep -w -e 'Banner' /var/log/nginx/nginx.log
8.8.8.8 - - [08/Jul/2024:13:02:35 +0300] "GET / HTTP/1.1" 301 169 "-" "HTTP Banner Detection (https://security.ipip.net)" "-"
root@localhost:#

Рекурсивный поиск grep

Но что если файл не один и необходимо найти совпадение по множеству файлов в одной директории?
Для этого в grep существует опция -r, позволяющая определить папку для поиска по содержимому.
grep -r "ghn" /var/log

Вывод команды:
root@localhost:# grep -r 'ghn' /var/log
/var/log/secure:Jun 18 02:00:05 localhost sshd[20213]: Invalid user tamoghna from 8.8.8.8 port 38938
/var/log/secure:Jun 18 02:00:05 localhost sshd[20213]: input_userauth_request: invalid user tamoghna [preauth]
/var/log/secure:Jun 18 02:04:20 localhost sshd[20284]: Invalid user tamoghna from8.8.8.8 port 40780
/var/log/secure:Jun 18 02:04:20 localhost sshd[20284]: input_userauth_request: invalid user tamoghna [preauth]
root@localhost:#

Фильтрация вывода команд

Очень часто в Linux вывод команд в терминал громаден или содержит много не нужной информации, для этого используем pipe или же перенаправление в утилиту grep.
Выглядит это так, предположим нам необходимо проверить установлен ли пакет NetworkManager для управления сетями:
yum list | grep "NetworkManager"

Если вы используете apt-менеджер, замените dnf в команде:
apt list | grep "NetworkManager"

Вывод команды:
root@localhost:# yum list | grep "NetworkManager"
NetworkManager.x86_64                                 1:1.18.4-3.el7            @base
NetworkManager-libnm.x86_64                           1:1.18.4-3.el7            @base
NetworkManager-team.x86_64                            1:1.18.4-3.el7            @base
NetworkManager-tui.x86_64                             1:1.18.4-3.el7            @base
NetworkManager-wifi.x86_64                            1:1.18.4-3.el7            @base
NetworkManager.x86_64                                 1:1.18.8-2.el7_9          updates
NetworkManager-adsl.x86_64                            1:1.18.8-2.el7_9          updates
NetworkManager-bluetooth.x86_64                       1:1.18.8-2.el7_9          updates
NetworkManager-config-server.noarch                   1:1.18.8-2.el7_9          updates
root@localhost:#

  • 0 Пользователи нашли это полезным

Помог ли вам данный ответ?

Ищете что-то другое?

mhost.by