grep — консольная утилита nix систем, позволяющая искать файл\файлы по шаблонам(регулярным выражениям) в файловой системе, фильтровать вывод других команд.
Регулярные выражения (regexp) – механизм поиска информации по в заранее заданным шаблонам в соответствии с определенными правилами.
Ознакомиться с тарифами для VPS хостинга можно тут
Подготовка
В основном, на многих дистрибутивах уже существует предустановленный с ней пакет. Для того чтобы проверить наличие его на вашей машине введите команду:
grep
Если вывод выглядит следующим образом, то пакет уже установлен
root@localhost:# grep
Usage: grep [OPTION]... PATTERNS [FILE]...
Try 'grep --help' for more information.
root@localhost:#
Установить grep можно через пакетный менеджер
Ubuntu, Debianapt 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:#