Поиск файлов и содержимого в Linux: команды find и grep.

Поиск файлов и содержимого в Linux: команды find и grep.

Life-Hack - Linux/Хакинг/Хакер/ИБ/Osint

Один из важнейших навыков администраторов Linux-систем - это умение искать файлы и данные в операционной системе. В большинстве Linux-дистрибутивов есть все необходимые программы для поиска: find и grep. Эти два мощнейших инструмента мы и рассмотрим в нашей статье.

find

Общий синтаксис команды find выглядит так:

find [directory to search] [options] [expression]

Простой пример:

find . -type f -name myfile

Такая команда выполнит поиск файла (именно файла, не папки) с именем myfile в текущей папке и подпапках. Опция  -type f сужает поиск до файлов. Точка (.) указывает на текущую папку. Если нужно найти папку, укажите тип type -d.

Так выполняется поиск файлов и папок по имени:

find . -name SEARCH_NAME

Поскольку тип объекта не указан, команда выполняет поиск и файлов, и папок.

Пример ниже — поиск файлов и папок с именем «mystuff»:

find -name mystuff

Команда find по умолчанию учитывает регистр. Чтобы выполнить поиск по имени файла без учёта регистра, надо ввести опцию -iname вместо -name.

find . -type f -iname SEARCH_NAME

Скажем, вы хотите найти все файлы С++ в текущих папках. Файлы С++ имеют расширение .cpp, и вот как их можно найти:

find . -type f -name "*.cpp"

А что если нужно найти файлы с несколькими разными расширениями? Вместо того чтобы прогонять команду find несколько раз, введите её один раз с опцией -o, которая работает как логическое условие «или»:

find . -type f -name "*.cpp" -o -name "*.txt" 

Если нужные вам файлы могут находиться в нескольких папках, можно выполнить поиск во всех этих расположениях за один раз. Просто укажите все пути к папкам при введении команды find:

find ./location1 /second/location -type f -name "pattern"

 Опция -empty позволяет использовать команду find для поиска пустых файлов и папок:

find . -empty

Команда find поможет найти крупные или мелкие файлы, если выполнить поиск по размеру. Но это работает только для файлов, не для папок. Используется опция -size с аргументом +N для файлов размером более N и -N для файлов размером менее N.

Найти файлы точного заданного размера (50 КБ):

find . -size 50k

Так выполняется поиск файлов размером более 1 ГБ в текущей папке:

find . -size +1G

Для поиска файлов размером более 10 МБ, но менее 1ГБ, введите:

find . -size +10M -size -1G

Найти все файлы, претерпевшие изменения за последние трое суток (3*24ч), можно так:

find . -type f -mtime -3

А все файлы, созданные пять и более дней назад, ищутся так:

find . -type f -ctime +5

Если нужно выявить файлы, изменённые всего пару минут назад? Для этого предусмотрены опции mmin, amin и cmin. Так выглядит команда поиска всех файлов, изменённых за последние пять минут:

find . -type f -mmin -5

Поищем в текущей папке, к примеру, все файлы с режимом доступа 777:

find . -perm 777

Вот как обнаружить в текущей папке все файлы пользователя Джона:

find . -type f -user John

По умолчанию команда find выполняет поиск во всех подпапках текущего расположения. Если это не требуется, можно ограничить глубину поиска значением «1». Так вы ограничитесь поиском в текущей папке, не залезая в подпапки.

find . -maxdepth 1 -type f -name "*.txt"

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

  • -delete — Удаляет соответствующие результатам поиска файлы
  • -ls — Вывод более подробных результатов поиска.
  • -print Стоит по умолчанию, если не указать другое действие. Показывает полный путь к найденным файлам.
  • -exec Выполняет указанную команду в каждой строке результатов поиска.

Для сисадминов и разработчиков комбинация команд find и grep — одна из самых распространённых и вместе с тем самых полезных. Команда find находит файлы с именем, соответствующим шаблону, а затем команда grep выполняет поиск по их содержимому. Например, вам нужно найти все файлы .txt, в которых есть имя «alice». Объединить команды find и grep можно так:

find . -type f -name "*.txt" -exec grep -i alice {} +

А можно с помощью xargs:

find . -type f -name "*.txt" | xargs grep -i alice

grep

Если нужно найти конкретную папку или один файл среди сотни других, то мы можем передать вывод команды ls в grep через вертикальную черту (|), а уже grep-у параметром передать нужное слово:

ls | grep Documents

Если же нужно найти не одно слово, а словосочетание или целое предложение, то параметр команды grep должно быть выделено кавычками. Grep поддерживает как одинарные, так и двойные кавычки:

ls | grep 'My Documents'

Несмотря на то, что команда grep чаще используется как своего рода фильтр для других команд, но её также можно использовать отдельно как на примере ниже:

grep 'Class 1' Students.txt

В этом примере мы вели поиск указанных в кавычках слов в файле Students.txt.
Команде grep можно передавать не один параметр, а несколько. Для этого перед каждым аргументом пишется ключ e. Эту команду система понимает, как "или-или" и выводит все вхождения указанных слов. Заметьте, что кавычками выделена только строка, которая содержит пробел:

grep -e 'Class 1' -e Todd Students.txt

Команда ниже выводит все строки, в которых есть две подряд идущих буквы "p":

grep -E p{2} fruits.txt

Чтобы вести поиск по указанному шаблону среди всех файлов во всех папках и подпапках, команду grep нужно запустить с ключом r. Команда выведет все файлы, где найдено совпадение с указанным шаблоном, а также путь к ним. По умолчанию поиск ведется по текущей директории и поддиректориях:

grep -r pattern /directory/to/search

[квадратные скобки] - используются чтобы проверить на соответствие одному из указанных символов:

grep "Class [123]" Students.txt

(Отобразит все строки, в которых встречается "Class 1" или "Class 2" или "Class 3")

[-] знак дефиса означает диапазон значений. Это могут быть как буквы, так и цифры:

grep "Class [1-3]" Students.txt

^ каретка используется для поиска строк, которые начинаются с указанного шаблона. Команда ниже выведет все строки, которые начинаются с буквы "А":

grep "^A" Students.txt

$ знак доллара означает конец строки. Команда выведет только те строки, в конце которых встречает указанный шаблон:

grep "1$" Students.txt

.точка обозначает один любой символ. Чтобы указать несколько любых символов, можно написать символ точку нужное количество раз:

grep "A.a" Students.txt

Использования условного оператора ИЛИ (OR) с командой grep:

grep -E 'string1|string2' filename

По умолчанию, grep чувствительна к регистру, что немного мешает поиску, так как мы должны точно указать регистр букв при поиске. Эта проблема решается путем добавления ключа i к команде поиска:

grep -i string filename

Чтобы просмотреть содержание файла с исключением конкретной строки к запросу нужно добавить ключ v:

grep -v string-to-exclude filename

Для поиска и замены одного текста другим командой grep, нужно запустить её, а вывод передать команде sed. Команда ниже заменить все вхождения строки "string1", на "string2" во всех файлах в текущей директории:

grep -rl 'string1' ./ | xargs sed -i 's/string1/string2/g'

Чтобы показать номер строки, где была найдена искомая строка, команду grep следует запускать с ключом n:

grep -n string filename

Если нужно узнать в каком контексте употреблялась искомая фраза, можно вывести предложения предшествующее и следующее за указанной строкой. Для этого нужно запустить команду grep с ключом c и передать число строк для отображения:

grep -c 1 string filename

Чтобы отсортировать вывод команды grep по какому-либо порядку, за ней следует прописать команду sort через вертикальную чёрточку (|). По умолчанию sort отсортирует результат по алфавиту:

grep string filename | sort


Report Page