Linux grep поиск файлов по названию

Как выполнить поиск файлов и папок в Linux

В качестве вступительного слова дадим некоторое описание того, как вообще можно совершать поиск в linux. Для этих целей есть множество программ, но некоторые из них уже стали классикой поиска в linux. Подчеркнем, в данной статье мы сконцентрируемся исключительно на linux. Это означает, что даже если вы встретите утилиты с теми же самыми названиями в Solaris или операционных системах на ядрах BSD, приведенные советы могут работать не всегда. Так же это относится к busybox, которая реализует лишь небольшую часть функциональности оригинальных утилит.

Итак встречайте героев сегодняшнего обзора: locate — предоставляет поиск по имени файла в заранее подготовленной базе данных, find — работает на реальной файловой системе и предоставляет невероятные возможности для поиска файлов и папок по различным параметрам. Также мы расскажем вскользь о grep — утилите для поиска текста в файлах.

Поиск файла по имени при помощи утилиты locate

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

Если же вы получили сообщение о том, что команда не найдена, возможно её нужно установить. Для Debian-based дистрибутивов (Ubuntu, Mint) установить её можно командой:

# apt-get install mlocate

Пользователям RedHat, CentOS и Fedora стоит выполнить

# yum install mlocate

После установки нужно создать/обновить базу данных — файл, содержащий в себе «снимок» файловой системы, благодаря которому locate работает так быстро:

Т.е. вместо того, чтобы каждый раз проходиться по всей файловой системе, locate доверяет updatedb создать файл, содержащий в себе все имена и пути файловой системы, и выполняет поиск в нем. Важно поддерживать его актуальность, иначе вы можете случайно найти уже давно удаленные файлы, или не найти новые. Поэтому updatedb при инсталляции «вешается» на CRON и выполняется автоматически — вы можете в этом убедиться, посмотрев на файлы заданий CRON.

Поиск в Linux при помощи утилиты find

Куда более мощным и гибким инструментом для поиска файлов и папок в Linux выступает команда find. Её синтаксис упрощенно выглядит так:

find [path. ] [expression]

Поиск файла по имени

Чтобы выполнить в linux поиск файла по имени по всей файловой системе нужно ввести:

# find / -name myfilename

Учтите, что в данном случае поиск будет идти по имени файла в точности соответствующему заданному. Чтобы сымитировать поведение команды locate для find следует ввести:

# find / -name «*part_of_name*»

«*» означает любое количество любых символов. Это дает нам возможность также производить поиск файлов по расширению:

Поиск файла по дате

Вот пример того, как можно выполнить поиск в Linux файла по дате:

# find /home -mtime -5

Данная команды выведет все файлы из каталога /home, измененные не более 5-ти дней назад.

Поиск файла по размеру

А так, например, можно выполнит поиск файлов по размеру:

# find /home -size +1G

Данная команды выведет все файлы из каталога /home, имеющие размер более одного гигабайта. Очень удобно для поиска больших файлов в linux

Поиск папки

На самом деле поиск папки в linux ничем не отличается от поиска файла, так как папка — это файл. Однако find дает нам возможность указать тип. Например, чтобы явно выполнить поиск только папок, имена которых содержат слово, например, mysql, выполните

# find / -type d -name «*mysql*»

Здесь ключ «-type» указывает на тип. На текущий момент времени find поддерживает следующие типы:

  • b — блочное устройство
  • c — символьное устройство
  • d — папка (дирректория)
  • p — именнованный канал
  • f — обычный файл
  • l — символическая ссылка
  • s — сокет
  • D — дверь (только для Solaris)

Подробнее о различных параметрах поиска find вы можете почитать, введя команду

Поиск текста в Linux при помощи утилиты grep

Да, grep действительно очень хорош, когда речь заходит о поиске текста в файлах в linux по паттерну. Сразу оговоримся, что искать текст мы будем в файлах в формате plain text — чистый текст, таких как конфигурационные файлы, сценарии командного интерпретатора (bash. python, php. ) и др. Искать по файлам Word и Excel грепом эффективно вряд ли получится.

Читайте также:  Windows 10 добавить пользователя администратор

Итак, чтобы выполнить поиск строки по всем файлам в каталоге, например /etc следует ввести

# grep -lri root /etc/*

Такая команда выведет имена всех файлов, в которых удастся найти заветные 4 буквы «root». Здесь ключ «-l» заставляет grep выводить только имена файлов. Т.е. если вы хотите увидить ещё и ту саму строку, где удалось найти запрашиваемое слово, то «-l» стоит не указывать. Ключ «-r» выполняет поиск не только по /etc, но и по всем файлам во всех подпапках. И наконец ключ «-i» говорит не принимать во внимание регистр, т.е. grep будет искать не только слово «root», но и «ROOT», и «rOOt». Вы поняли

Конечно, вмемогущий grep поддерживает регулярные выражения. Чтобы выполнить, например, поиск строки, явно начинающийся всё с того же слова, введите

# grep -lri ^root /etc/*

Крышка в начале слова «root» обязывает grep выводит только те файлы, где слово «root» стоит в начале строки. И таких трюков достаточно много. Если вы еще не знакомы с regex, то стоит начать хотябы с википедии

Источник

Урок 9. Поиск файлов по имени и содержимому командами grep и locate

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

Поиск по имени файла:

locate [опции] имя_файла

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

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

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

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

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

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

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

Попробуем найти файлы, в имени которого присутствует слово user. Для этого введем следующую команду:

Чтобы имя файла точно соответствовало заданному шаблону поиска достаточно ввести:

locate -b user либо locate —basename user

Для того, чтобы не учитывать регистр (то есть заглавные и прописные буквы в имени файла) достаточно ввести:

locate -i имя_файла либо locate —ignore-case имя_файла

После этого система отобразит имена файлов с заглавными и прописными буквами.

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

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

Бывают ситуации, когда мы не знаем название файла, но знаем его содержимое. В данном случае будет полезна функция поиска файлов по его содержимому и в этом нам поможет следующая утилита:

grep [опции] шаблон файл

Для этого рассмотрим текстовый файл Linux.txt и попробуем найти слово configuration в его тексте:

grep configuration Linux.txt

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

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

Для этого есть опция -n или —line-number.

grep -n configuration Linux.txt

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

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

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

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

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

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

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

Достаточно ввести grep -n configuration *.

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

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

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

Читайте также:  Libreoffice deb для linux

grep —color=auto configuration *

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

grep -Rl configuration *

Команду grep удобно использовать и с другими командами, например ls .

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

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

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

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

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

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

Источник

Команда Grep в Linux (поиск текста в файлах)

Команда grep означает «печать глобального регулярного выражения», и это одна из самых мощных и часто используемых команд в Linux.

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

В этой статье мы покажем вам, как использовать команду grep на практических примерах и подробных объяснениях наиболее распространенных опций GNU grep .

Командный синтаксис grep

Синтаксис команды grep следующий:

Пункты в квадратных скобках необязательны.

  • OPTIONS — Ноль или более вариантов. Grep включает ряд опций , управляющих его поведением.
  • PATTERN — Шаблон поиска.
  • FILE — Ноль или более имен входных файлов.

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

Искать строку в файлах

Наиболее простое использование команды grep — поиск строки (текста) в файле.

Например, чтобы отобразить все строки, содержащие строку bash из файла /etc/passwd , вы должны выполнить следующую команду:

Результат должен выглядеть примерно так:

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

Инвертировать соответствие (исключить)

Чтобы отобразить строки, не соответствующие шаблону, используйте параметр -v (или —invert-match ).

Например, чтобы распечатать строки, не содержащие строковый nologin вы должны использовать:

Использование Grep для фильтрации вывода команды

Вывод команды может быть отфильтрован с помощью grep через конвейер, и на терминал будут напечатаны только строки, соответствующие заданному шаблону.

Например, чтобы узнать, какие процессы выполняются в вашей системе как пользовательские www-data вы можете использовать следующую команду ps :

Вы также можете объединить несколько каналов по команде. Как вы можете видеть в выходных данных выше, также есть строка, содержащая процесс grep . Если вы не хотите, чтобы эта строка отображалась, передайте результат другому экземпляру grep как показано ниже.

Рекурсивный поиск

Для рекурсивного поиска шаблона вызовите grep с параметром -r (или —recursive ). Когда используется этот параметр, grep будет искать все файлы в указанном каталоге, пропуская символические ссылки, которые встречаются рекурсивно.

Чтобы следовать по всем символическим ссылкам , вместо -r используйте параметр -R (или —dereference-recursive ).

Вот пример, показывающий, как искать строку linuxize.com во всех файлах внутри каталога /etc :

Вывод будет включать совпадающие строки с префиксом полного пути к файлу:

Если вы используете опцию -R , grep будет следовать по всем символическим ссылкам:

Обратите внимание на последнюю строку вывода ниже. Эта строка не печатается, когда grep вызывается с -r потому что файлы внутри каталога с sites-enabled Nginx являются символическими ссылками на файлы конфигурации внутри каталога с sites-available .

Показать только имя файла

Чтобы подавить вывод grep по умолчанию и вывести только имена файлов, содержащих совпадающий шаблон, используйте параметр -l (или —files-with-matches ).

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

Результат будет выглядеть примерно так:

Параметр -l обычно используется в сочетании с рекурсивным параметром -R :

Поиск без учета регистра

По умолчанию grep чувствителен к регистру. Это означает, что символы верхнего и нижнего регистра рассматриваются как разные.

Чтобы игнорировать регистр при поиске, вызовите grep с параметром -i (или —ignore-case ).

Например, при поиске Zebra без какой-либо опции следующая команда не покажет никаких результатов, т.е. есть совпадающие строки:

Но если вы выполните поиск без учета регистра с использованием параметра -i , он будет соответствовать как заглавным, так и строчным буквам:

Указание «Зебра» будет соответствовать «зебре», «ZEbrA» или любой другой комбинации букв верхнего и нижнего регистра для этой строки.

Искать полные слова

При поиске строки grep отобразит все строки, в которых строка встроена в строки большего размера.

Читайте также:  Windows chkdsk cannot open volume

Например, если вы ищете «gnu», все строки, в которых «gnu» встроено в слова большего размера, такие как «cygnus» или «magnum», будут найдены:

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

Если вы запустите ту же команду, что и выше, включая параметр -w , команда grep вернет только те строки, где gnu включен как отдельное слово.

Показать номера строк

Параметр -n (или —line-number ) указывает grep показывать номер строки, содержащей строку, соответствующую шаблону. Когда используется эта опция, grep выводит совпадения на стандартный вывод с префиксом номера строки.

Например, чтобы отобразить строки из файла /etc/services содержащие строку bash префиксом совпадающего номера строки, вы можете использовать следующую команду:

Результат ниже показывает нам, что совпадения находятся в строках 10423 и 10424.

Подсчет совпадений

Чтобы вывести количество совпадающих строк в стандартный вывод, используйте параметр -c (или —count ).

В приведенном ниже примере мы подсчитываем количество учетных записей, в которых в качестве оболочки используется /usr/bin/zsh .

Бесшумный режим

-q (или —quiet ) указывает grep работать в тихом режиме, чтобы ничего не отображать на стандартном выводе. Если совпадение найдено, команда завершает работу со статусом 0 . Это полезно при использовании grep в сценариях оболочки, где вы хотите проверить, содержит ли файл строку, и выполнить определенное действие в зависимости от результата.

Вот пример использования grep в тихом режиме в качестве тестовой команды в операторе if :

Основное регулярное выражение

GNU Grep имеет три набора функций регулярных выражений : базовый, расширенный и Perl-совместимый.

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

Ниже приведен список наиболее часто используемых метасимволов:

Используйте символ ^ (каретка) для сопоставления выражения в начале строки. В следующем примере строка kangaroo будет соответствовать только в том случае, если она встречается в самом начале строки.

Используйте символ $ (доллар), чтобы найти выражение в конце строки. В следующем примере строка kangaroo будет соответствовать только в том случае, если она встречается в самом конце строки.

Используйте расширение . (точка) символ, соответствующий любому одиночному символу. Например, чтобы сопоставить все, что начинается с kan затем имеет два символа и заканчивается строкой roo , вы можете использовать следующий шаблон:

Используйте [ ] (скобки) для соответствия любому одиночному символу, заключенному в квадратные скобки. Например, найдите строки, содержащие accept или « accent , вы можете использовать следующий шаблон:

Используйте [^ ] для соответствия любому одиночному символу, не заключенному в квадратные скобки. Следующий шаблон будет соответствовать любой комбинации строк, содержащих co(any_letter_except_l)a , например coca , cobalt и т. Д., Но не будет соответствовать строкам, содержащим cola ,

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

Расширенные регулярные выражения

Чтобы интерпретировать шаблон как расширенное регулярное выражение, используйте параметр -E (или —extended-regexp ). Расширенные регулярные выражения включают в себя все основные метасимволы, а также дополнительные метасимволы для создания более сложных и мощных шаблонов поиска. Вот несколько примеров:

Сопоставьте и извлеките все адреса электронной почты из данного файла:

Сопоставьте и извлеките все действительные IP-адреса из данного файла:

Параметр -o используется для печати только соответствующей строки.

Поиск нескольких строк (шаблонов)

Два или более шаблонов поиска можно объединить с помощью оператора ИЛИ | .

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

В приведенном ниже примере мы ищем все вхождения слов fatal , error и critical в файле ошибок журнала Nginx :

Если вы используете опцию расширенного регулярного выражения -E , то оператор | не следует экранировать, как показано ниже:

Строки печати перед матчем

Чтобы напечатать определенное количество строк перед совпадающими строками, используйте параметр -B (или —before-context ).

Например, чтобы отобразить пять строк ведущего контекста перед совпадающими строками, вы должны использовать следующую команду:

Печатать строки после матча

Чтобы напечатать определенное количество строк после совпадающих строк, используйте параметр -A (или —after-context ).

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

Выводы

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

Подробнее о Grep можно узнать на странице руководства пользователя Grep .

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Оцените статью