Найти тему

Команда GREP - «швейцарский нож» в арсенале администратора Linux-сервера

Оглавление

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

Поиск файлов и папок через терминал в Linux-дистрибутивах

Не забываем также подписаться на обновления канал Просто Код в телеграме. Так вы будете получать уведомления о новых постах быстрее, чем уведомляет об этом Дзен.

Что делает команда GREP?

GREP расшифровывается как Global Regular Expression Print, что говорит о том, что она используется для поиска строк и шаблонов в группе файлов или папок, а также среди данных, которыми оперируют другие команды и процессы на сервере. Как это часто бывает в Linux, это не просто название команды, а отдельная системная и консольная утилита. В основе работы утилиты лежит расширенный синтаксис регулярных выражений, который появился в UNIX-системах 1981 году. GREP встречается во всех дистрибутивах Linux.

Синтаксис команды

Познакомимся с синтаксисом (то есть, правилами написания) команды grep.

grep [опции] [регулярное выражение] [место поиска - файл или директория]

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

Фильтруем «выхлоп» других команд

Вспомним про команду ls, которая выводит списком содержимое директории. В тестовом примере ниже у меня есть папка Test, внутри которой есть как файлы, так и папки. Файлы имеют имя File<набор_символов>, папки названы как Folder<набор_символов>. Мне нужно показать только папки и единственное, что я помню - это то, что каждая папка имеет имя Folder. Воспользуемся командами ls и grep, чтобы реализовать задуманное

ls | grep Folder

Символ прямой черты | еще называют «трубкой», он принимает выходные данные одной команды и передает их следующей в качестве входных данных. То есть, мы передали «выхлоп» команды ls в качестве входных данных команде grep, которая отфильтровала результаты и показала только то, что содержит в имени Folder. В моем примере папок всего четыре, но представьте, если бы их было несколько десятков и сотен - тогда бы подобная фильтрация сильно сэкономила время.

-2

В следующем примере нам нужны и файлы, и папки, которые имеют в имени какую-либо постоянную часть. Это может быть имя сервера, дата бэкапа и пр.

ls | grep ABC

-3

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

sudo netstat -lntup | grep "ssh"

-4

Поиск строк в файлах

Представим ситуацию, что у вас есть папка с сайтом. И внутри множества файлов этого сайта нужно найти конкретное слово. Не вручную же перебирать все файлы! Для этого тоже можно использовать команду grep. Например, среди пяти файлов в папке Test попробуем найти те, где используется слово «grep»:

grep -R “grep” Test

-5

Если нам необходимо объединить выражения и осуществить поиск нескольких строк, то нужно использовать ключ -e. Это своего рода указание «или» для утилиты. Попробуем найти среди наших файлов те, где встречаются слова «grep» или «php»:

grep -R -e “grep” -e “php” Test

-6

Также вместо папки мы можем указать имя конкретного файла (убрав перед этим ключ -R) и попытаться найти нужные строки в нем.

grep “grep” <имя_файла>

Если в файле не будет ничего найдено, то команда вернет пустую строку.

-7

Для расширения возможностей поиска строк в файлах можно использовать следующие ключи и так называемые якоря:

  • grep -i - поиск без учета регистра
  • grep -w - поиск по всему слову
  • grep -v - обратный поиск (то есть, он вернет все, что не соответствует заданной после строке)
  • grep -r -L - вернет имена файлов, в которых отсутствует заданный после шаблон для поиска
  • grep -n - выведет не просто найденную строку, но и укажет ее номер в документе
  • grep -A<количество> - выводит найденную строку и следующую строку после совпадения, количество выводимых строк можно менять
  • grep -B<количество> - выводит найденную строку и предыдущую строку до совпадения, количество выводимых строк можно менять
  • grep -C<количество> - выводит найденную строку и строки до и после совпадения, количество выводим строк можно менять
  • grep -q - запуск команды в тихом режиме, после выполнения она просто сохранит код статуса в системной переменной $? (если 0, то совпадения есть, если 1, то совпадений нет); такой метод используют в скриптах для проверки условий, когда не нужно выводить конкретную заданную строку.
  • grep “^” - якорь ^ говорит, что совпадение должно быть в начале строки
  • grep “$” - якорь $ говорит, что совпадение должно быть в конце строки
  • grep “\<” - якорь \< привязывает совпадение к началу слов
  • grep “\>” - якорь \> привязывает совпадение к концу слов

Поиск при помощи регулярных выражений (regular expression)

По-настоящему функционал grep раскрывается при использовании регулярных выражений. Раскрыть возможности их использования в одной статье невозможно, поэтому думаю, что работе с регулярными выражениями можно посвятить отдельную статью. Давайте договоримся о том, что если такая статья вам интересна, то вы поставите этому посту лайк и как только их наберется 15 штук, я подготовлю материал по regular expression.

Отличия grep и find

Отличия между двумя командами следующие:

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

Итог

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

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

Если не подписались на уведомления канала в Телеграм, то самое время сделать это, ведь информация о новых заметках приходит там сразу в момент публикации!