В статье про поиск файлов и папок мы говорили про команду 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. В моем примере папок всего четыре, но представьте, если бы их было несколько десятков и сотен - тогда бы подобная фильтрация сильно сэкономила время.
В следующем примере нам нужны и файлы, и папки, которые имеют в имени какую-либо постоянную часть. Это может быть имя сервера, дата бэкапа и пр.
ls | grep ABC
Ну, и наконец, более практичный пример. Очень часто на сервере нужно посмотреть какой порт «прослушивается» каким-либо процессом или программой. Для этого тоже можно использовать команду grep, чтобы отфильтровать значения до нужных. В команде ниже я вывожу порты, которые слушает протокол ssh.
sudo netstat -lntup | grep "ssh"
Поиск строк в файлах
Представим ситуацию, что у вас есть папка с сайтом. И внутри множества файлов этого сайта нужно найти конкретное слово. Не вручную же перебирать все файлы! Для этого тоже можно использовать команду grep. Например, среди пяти файлов в папке Test попробуем найти те, где используется слово «grep»:
grep -R “grep” Test
Если нам необходимо объединить выражения и осуществить поиск нескольких строк, то нужно использовать ключ -e. Это своего рода указание «или» для утилиты. Попробуем найти среди наших файлов те, где встречаются слова «grep» или «php»:
grep -R -e “grep” -e “php” Test
Также вместо папки мы можем указать имя конкретного файла (убрав перед этим ключ -R) и попытаться найти нужные строки в нем.
grep “grep” <имя_файла>
Если в файле не будет ничего найдено, то команда вернет пустую строку.
Для расширения возможностей поиска строк в файлах можно использовать следующие ключи и так называемые якоря:
- 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.
Давайте же поддержим канал подпиской, лайком и комментариями, ведь чем больше активности вы проявляете, тем чаще алгоритмы Дзена показывают посты в ленте рекомендаций.
Если не подписались на уведомления канала в Телеграм, то самое время сделать это, ведь информация о новых заметках приходит там сразу в момент публикации!