Урок 9. Поиск файлов и фрагментов текста в файлах. Команды locate и grep

Поиск файлов 

Очень часто вам придется использовать поиск файлов или определенного текста в файлах. Для этого в Linux есть несколько достаточно мощные утилиты. 

Поиск по имени файла осуществляется так: locate [опции] имя_файла

Очень быстрая утилита и позволяет искать название файла в индексируемой базе данных. Каждый день система заносит новые названия файлов в базу данных и удаляет уже неактуальные записи. 

Система индексирует абсолютно все файлы либо только определенные? 

Абсолютно все файлы. Однако следует учитывать, что если файл новый, а система еще не успела его проиндексировать, то команда locate его не найдет. 

То есть придется ждать пока она это сделает? 

Необязательно. Можно принудительно обновить базу данных с помощью команды updatedb. 

А где находится эта база данных? 

Здесь - /var/lib/mlocate/mlocate.db. Необходимо обладать правами root для доступа к этому файлу. 

Попробуем найти файлы, в имени которого присутствует слово user - locate user:

Вывод списка всех файлов, которые содержат слово user с помощью locate
Рис. 1. Вывод списка всех файлов, которые содержат слово user

Чтобы имя файла точно соответствовало заданному шаблону поиска достаточно ввести locate -b user либо locate --basename user

Для того, чтобы не учитывать регистр (то есть заглавные и прописные буквы в имени файла) достаточно ввести locate -i имя_файла  либо locate --ignore-case имя_файла и система отобразит  имена файлов с заглавными и прописными буквами. 

Иногда результат поиска выдает большое число записей. В данном случае можно перенаправить вывод на вход  команды less. Например, так - locate init | less.

Поиск фрагментов текста в текстовых файлах 

Для этого используется команда grep [опции] шаблон файл

Имеется текстовый файл Linux.txt. Попробуем найти слово configuration в тексте файла - grep configuration Linux.txt:

Поиск фрагментов текста, которые содержат слово configuration
Рис. 2. Поиск фрагментов текста, которые содержат слово configuration

Команда вывела сами строки, где встречается искомое слово. 

А если текст содержит тысячи строк, то как я найду эту строку в файле? 

Для этого есть опция -n или --line-numbergrep -n configuration Linux.txt:

Отображение номеров строк, в которых содержится искомое слово
Рис. 3. Отображение номеров строк, в которых содержится искомое слово

Теперь с помощью текстовых редакторов можно легко найти искомую строку. 

А можно осуществить поиск в нескольких файлах или по всей системе? 

Конечно, с помощью символов групповых операций.

К примеру,  у нас 4 файла, в именах которых присутствует слово manual:

Вывод списка файлов, содержащие слово manual
Рис. 4. Вывод списка файлов, содержащие слово manual

Какую команду введем? Конечно же grep -n configuration *manual*.txt:

Поиск слова manual во всех файлах
Рис. 5. Поиск слова manual во всех файлах

Как видно сначала выводится название файла, за ним номер строки и затем сама строка с искомым словом.  

Ну а если у имен этих файлов нет общих слов, то как осуществить поиск? 

Достаточно ввести grep -n configuration *. Когда используется данная комбинация, то grep ищет только в текущем каталоге! То есть вложенные каталоги не учитываются.

Чтобы учесть и вложенные подкаталоги необходимо использовать опцию -R или --dereference-recursivegrep -R configuration *

Как вы уже заметили система уже выделила красным цветом искомое слово, чтобы лучше ориентироваться. Однако не всегда система по умолчанию выделяет цветом искомое слово. Поэтому в такой ситуации используйте  опцию --color=autogrep  --color=auto configuration *

Ну а если вдруг вам понадобится знать в каких файлах находится искомый текст и ничего больше, то воспользуйтесь опцией -l либо --files-with-matchesgrep -Rl  configuration *:

Вывод файлов с искомым словом
Рис. 6. Вывод файлов с искомым словом

Команду grep удобно использовать и с другими командами, например ls. Допустим мы хотим отобразить только файлы с расширением txt. Для этого выполним - ls  | grep --color=auto txt:

Совместное использование команд ls и grep
Рис. 7. Совместное использование команд ls и grep

Вариантов применения grep с другими командами очень много и по мере прохождения курса можно придумать довольно интересные комбинации. 

Для данной команды доступны следующие опции: 

-i (--ignore-case) - не учитывается регистр 

-w (--word-regexp) - при поиске учитывается целое имя, то есть отображаются записи, в точности соответствующие заданному шаблону. 

-v (--invert-match) - инвертированный поиск, то есть будут отображаться только те записи, где искомое слово отсутствует.