Иногда в Linux нужно осуществить поиск файла по содержимому. Такие случаи возникают, когда вы точно знаете, что на устройстве есть файл с определенным содержимым, но не помните, где он располагается. Если просто перепроверять все папки и файлы системы, то можно потратить уйму времени.
Для такого поиска в Linux есть простая, но очень мощная утилита «grep». Поиск по содержимому файлов в Linux — это лишь малая часть способностей этой утилиты.
Поиск по содержимому файлов в Linux с помощью утилиты «grep»
Использовать утилиту «grep» не означает, что нужно что-то дополнительно устанавливать в Linux. В большинстве популярных дистрибутивов «grep» является встроенной утилитой. Ваша задача при ее использовании — это правильно сформировать команду в терминале. Если овладеть этой утилитой, тогда в Linux можно будет:
осуществлять поиск по содержимому файлов, используя одно слово или целое выражение;
осуществлять поиск файлов, используя регулярные выражения;
фильтровать вывод файлов;
фильтровать выводимый текст;
читать логи;
выводить идентификаторы запущенных процессов;
и мн. др.
Утилита «grep»
Использование утилиты «grep» формируется по следующему шаблону:
$ grep [описание условий] шаблон [название документа или место поиска…]
Либо по такому шаблону:
$ исполняемая инструкция или место поиска | grep[описание условий] шаблон
Разберем формирование шаблонов утилиты «grep»:
«описание условий» — здесь описываются все дополнительные условия или режимы вывода, например: количество файлов, количество строк, режим инверсии и др.;
«шаблон» — здесь описывается содержимое искомого файла или регулярное выражение;
«место поиска, название документа, исполняемая инструкция» — здесь можно указать где и как утилита «grep» должна искать, к примеру во всей системе, либо в конкретном каталоге или файле и др.
Перечень основных опций утилиты «grep»
Основные опции утилиты «grep» помогает ее очень эффективно использовать. К ним относят:
«-b» — показывает нумерацию блока перед строкой;
«-с» — считает вхождения с шаблоном, заданным в команде;
«-h» — указывает, что не нужно выводить название найденного файла;
«-i» — указывает, что при поиске не нужно учитывать регистр;
«-l» — указывает, что нужно вывести только названия файлов, где есть вхождения, а не сами файлы;
«-n» — выводит номер строки файла, где есть вхождение с шаблоном;
«-s» — указывает, что не нужно выводить уведомления об ошибках;
«-v» — определяет инвертированный поиск, то есть выводит всё содержимое файла, исключая выражение из шаблона команды;
«-w» — ищет конкретное слово, обозначенное пробелами с двух сторон;
«-е» — указывает, что в шаблоне используется регулярное выражение;
«-r» — указывает, что поиск будет рекурсивный;
и др.
Поиск по содержимому файлов в Linux на практике
Допустим, что у нас есть некий документ, где собраны тысячи логинов наших пользователей. Если вам нужно найти конкретный логин в этом файле, тогда команда «grep» будет выглядеть вот так:
$ grep Login /etc / logindoc
где:
«Login» — это искомый логин пользователя;
«/etc /logindoc» — это путь к конкретному документу, в котором нужно осуществить поиск.
Например, вам нужно вывести логин пользователя, но вы не знаете в каком конкретном документе он располагается, а все логины пользователей раскинуты в несколько файлов. Для этого нужно применить рекурсивный поиск по всем файлам определенного каталога. В этом случае команда «grep» может выглядеть вот так:
$grep -r "Логин, который ищем" /etc/loginfolder/
Если запустить вышеописанную команду, тогда в выводе вы получите подробный результат:
путь расположения документа, где обнаружено вхождение;
название документа, в котором обнаружено вхождение.
На практике такой подробный результат только мешает, поэтому можно использовать опцию «-h», чтобы название документа не выводилось.
Дело в том, что когда вы ищете конкретное слово в документах, например имя вашего сотрудника «Дормидонт», тогда в результатах «grep» будут попадаться такие результаты:
Дормидонт456;
Дормидонтович;
665дормидонт;
и др.
То есть поиск будет не чистым, так как в результатах вы получите все совпадения с искомым словом. Если вам нужно найти совпадения с конкретным словом, без лишних «примесей», тогда нужно воспользоваться опцией «-w». Команда «grep» может быть такой:
$ grep -w "Дормидонт" имя_документа_где_искать
А если у вас сотрудников с именем Дормидонт несколько десятков, а вам нужен конкретный, например Дормидонт Платонович, тогда вы можете воспользоваться от такой конструкцией утилиты «grep»:
$ grep -w "Дормидонт|Платонович" имя_документа_где_искать
Но может быть и обратная ситуация. Например, вы хотите узнать, сколько в конкретном документе у вас строк с именем "Дормидонт". Для этого можно внутри команды «grep» включить счетчик с помощью опции "-с". Тогда команда будет выглядеть вот так:
$ grep -c "Дормидонт" имя_документа_где_искать
Если возникла такая ситуация, что вам нужно вывести строки, которые не содержат искомое слово. В этом случае вы можете использовать инвертированный поиск, который активируется опцией "-v". Тогда команда может выглядеть вот так:
$ grep -v "Дормидонт" имя_документа_где_искать
Допустим, вам нужно выполнит масштабный поиск в системе и вывести все файлы, а не строки, где есть совпадения в содержимом. В этом случае вам нужно воспользоваться опцией "-l". Тогда команда будет выглядеть вот так:
$ grep -l "Дормидонт" *.c
Заключение
В Linux поиск по содержимому файлов организован очень достойно, благодаря утилите «grep». Как вы успели заметить, что даже поиск по содержимому файлов может быть разным и четко соответствовать вашим требованиям.
Linux