Grep поиск в файлах с расширением

Обновлено: 07.07.2024

это возвращает имя файла файлов, содержащих слова "Book" и "Stars". Как вы можете изменить это так, чтобы вы могли искать только файлы *.txt ? Кроме того, есть ли способ указать каталог поиска?

2 ответа

Мне нужно найти только файлы в каталоге, которые имеют расширение с помощью ls (не могу использовать find). Я попробовал ls *.*, но если dir не содержит никакого файла с расширением, он возвращает No such file or directory. Я не хочу этой ошибки и хочу, чтобы ls возвращался в приглашение cmd, если.

Можно ли сказать grep использовать разные выходные файлы для каждого типа совпадающей строки поиска? Мне нужно поиск по всем *.журнал рекурсивно найти все [ERROR], [WARN] и [ASSERT]. Но я хотел бы, чтобы он был разделен в разных выходных файлах. Один выходной файл для каждой строки поиска. (без.

UPDATE :

Если вы хотите указать свой каталог . возьмем этот пример :

Если поиск не чувствителен к регистру , используйте параметр -i для grep cmd:

Найти против Найти :

  • Find более эффективен для новых файлов .
  • Locate является самым быстрым, поскольку он обрабатывает базу данных строк(пути к файлам)

Просто используйте параметр -iname . Это заставляет find искать все файлы с расширением " .txt " (без учета регистра). Также добавьте параметр -type f , чтобы убедиться, что вы ищете только файлы (это должно позволить вам удалить параметр-s "suppress error", переданный в grep ).

Вместо этого вы также можете использовать параметр -exec .

Параметр -Z для grep и параметр -0 для xargs гарантируют, что имена файлов, передаваемые по конвейеру от одного к другому, работают, даже если в них есть пробелы.

Похожие вопросы:

У меня есть тысячи папок, заполненных старым хламом,в котором мне нужно разобраться. А именно, мне нужно найти все файлы, содержащие определенный текст в файлах с помощью маски. Но если я делаю это.

Как я могу искать файлы с определенным расширением, поиск должен осуществляться через все логические диски, доступные на моем компьютере. я пытался как var di = new Directoryinfo( somepath); Files =.

В основном я просто хочу сделать ack foo *. citrus и заставить ack детализировать и найти строку 'foo' во всех файлах Citrus в текущем каталоге и ниже. Беда в том, что это не сработает, если в.

Мне нужно найти только файлы в каталоге, которые имеют расширение с помощью ls (не могу использовать find). Я попробовал ls *.*, но если dir не содержит никакого файла с расширением, он возвращает.

Можно ли сказать grep использовать разные выходные файлы для каждого типа совпадающей строки поиска? Мне нужно поиск по всем *.журнал рекурсивно найти все [ERROR], [WARN] и [ASSERT]. Но я хотел бы.

Я бы использовал следующую команду для grep текста в каталоге со многими файлами. grep -irl SampleText *.txt Мой случай относится к grep только в .txt файлах. При выполнении приведенной выше команды.

Я хотел бы найти определенный набор строк в файлах с определенным расширением файла (здесь это .textfile ) У меня есть в текущей папке. Для этого я хочу использовать make . Предварительно я.

Чтобы найти все пути к файлам с расширением .out в подкаталогах, я использую find . -name '*.out' Для grep шаблона во всех файлах, заканчивающихся на .out , я использую grep pattern *.out Как мне.

Я пытаюсь переместить файлы с расширением .txt. ls /original/file/path | grep .txt Это успешно перечисляет файлы с расширением txt. Однако когда я делаю следующее: mv `ls /original/file/path | grep.

У меня есть каталог с несколькими уровнями подкаталогов. Эти подкаталоги содержат комбинацию файлов .avi, .txt и .csv. Я хочу иметь возможность искать во всех файлах .csv определенное слово. Прямо.

Иногда может понадобится найти файл, в котором содержится определённая строка или найти строку в файле, где есть нужное слово. В Linux всё это делается с помощью одной очень простой, но в то же время мощной утилиты grep. С её помощью можно искать не только строки в файлах, но и фильтровать вывод команд, и много чего ещё.

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

Что такое grep?

Команда grep (расшифровывается как global regular expression print) - одна из самых востребованных команд в терминале Linux, которая входит в состав проекта GNU. Секрет популярности - её мощь, она даёт возможность пользователям сортировать и фильтровать текст на основе сложных правил.

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

Синтаксис grep

Синтаксис команды выглядит следующим образом:

$ grep [опции] шаблон [имя файла. ]

$ команда | grep [опции] шаблон

  • Опции - это дополнительные параметры, с помощью которых указываются различные настройки поиска и вывода, например количество строк или режим инверсии.
  • Шаблон - это любая строка или регулярное выражение, по которому будет вестись поиск
  • Файл и команда - это то место, где будет вестись поиск. Как вы увидите дальше, grep позволяет искать в нескольких файлах и даже в каталоге, используя рекурсивный режим.

Возможность фильтровать стандартный вывод пригодится,например, когда нужно выбрать только ошибки из логов или найти PID процесса в многочисленном отчёте утилиты ps.

Опции

Давайте рассмотрим самые основные опции утилиты, которые помогут более эффективно выполнять поиск текста в файлах grep:

Все самые основные опции рассмотрели и даже больше, теперь перейдём к примерам работы команды grep Linux.

Примеры использования

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

Поиск текста в файлах

В первом примере мы будем искать пользователя User в файле паролей Linux. Чтобы выполнить поиск текста grep в файле /etc/passwd введите следующую команду:

grep User /etc/passwd

В результате вы получите что-то вроде этого, если, конечно, существует такой пользователь:

А теперь не будем учитывать регистр во время поиска. Тогда комбинации ABC, abc и Abc с точки зрения программы будут одинаковы:

grep -i "user" /etc/passwd

Вывести несколько строк

Например, мы хотим выбрать все ошибки из лог-файла, но знаем, что в следующей строчке после ошибки может содержаться полезная информация, тогда с помощью grep отобразим несколько строк. Ошибки будем искать в Xorg.log по шаблону "EE":

grep -A4 "EE" /var/log/xorg.0.log

Выведет строку с вхождением и 4 строчки после неё:

grep -B4 "EE" /var/log/xorg.0.log

Выведет целевую строку и 4 строчки до неё:

grep -C2 "EE" /var/log/xorg.0.log

Выведет по две строки с верху и снизу от вхождения.

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

Регулярные выражения grep - очень мощный инструмент в разы расширяющий возможности поиска текста в файлах. Для активации этого режима используйте опцию -e. Рассмотрим несколько примеров:

grep "^Nov 10" messages.1

Nov 10 01:12:55 gs123 ntpd[2241]: time reset +0.177479 s
Nov 10 01:17:17 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10

Поиск в конце строки - спецсимвол "$":

grep "terminating.$" messages

Jul 12 17:01:09 cloneme kernel: Kernel log daemon terminating.
Oct 28 06:29:54 cloneme kernel: Kernel log daemon terminating.

Найдём все строки, которые содержат цифры:

grep "3" /var/log/Xorg.0.log

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

Рекурсивное использование grep

grep -r "mydomain.com" /etc/apache2/

В выводе вы получите:

grep -r "zendsite" /etc/apache2/
/etc/apache2/vhosts.d/zendsite_vhost.conf: ServerName zendsite.localhost
/etc/apache2/vhosts.d/zendsite_vhost.conf: DocumentRoot /var/www/localhost/htdocs/zendsite
/etc/apache2/vhosts.d/zendsite_vhost.conf: <Directory /var/www/localhost/htdocs/zendsite>

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

grep -h -r "zendsite" /etc/apache2/

ServerName zendsite.localhost
DocumentRoot /var/www/localhost/htdocs/zendsite
<Directory /var/www/localhost/htdocs/zendsite>

Поиск слов в grep

Когда вы ищете строку abc, grep будет выводить также kbabc, abc123, aafrabc32 и тому подобные комбинации. Вы можете заставить утилиту искать по содержимому файлов в Linux только те строки, которые выключают искомые слова с помощью опции -w:

grep -w "abc" имя_файла

Поиск двух слов

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

egrep -w 'word1|word2' /path/to/file

Количество вхождений строки

Утилита grep может сообщить, сколько раз определённая строка была найдена в каждом файле. Для этого используется опция -c (счетчик):

grep -c 'word' /path/to/file

C помощью опции -n можно выводить номер строки, в которой найдено вхождение, например:

grep -n 'root' /etc/passwd

Инвертированный поиск в grep

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

grep -v пар /path/to/file

Вывод имени файла

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

grep -l 'primary' *.c

Цветной вывод в grep

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

grep --color root /etc/passwd


Выводы

Вот и всё. Мы рассмотрели использование команды grep для поиска и фильтрации вывода команд в операционной системе Linux. При правильном применении эта утилита станет мощным инструментом в ваших руках. Если у вас остались вопросы, пишите в комментариях!

в настоящее время я пытаюсь сделать скрипт, который бы вводил grep, чтобы увидеть, имеет ли что-то определенный тип файла (например, zip), хотя текст перед типом файла может быть чем угодно, так, например

все подпадают под категорию. Я пытаюсь grep для них, используя подстановочный знак, и до сих пор я пробовал это

но когда я это сделаю, он найдет .zip файлы просто отлично, но он все равно будет выводить изображение, если есть дополнительные символы после .zip например .zippppppp или .zipdsjdskjc все равно будет подобран grep. Сказав это, что я должен сделать, чтобы предотвратить grep от отображения совпадений, которые имеют дополнительные символы после .zip ?

тест для конца строки с $ и избежать вторую . С обратной косой чертой, поэтому он соответствует только периоду, а не любому символу.

ls *.zip - это более естественный способ сделать это, если вы хотите получить список всех .zip файлы в текущем каталоге или find . -name "*.zip" для всех .zip файлы в подкаталогах, начиная с (и в том числе) текущий каталог.

в UNIX попробуйте:

вам нужно сделать несколько вещей. Это должно выглядеть так:

вам нужно избежать второй точки, поэтому она будет просто соответствовать точке, а не любому символу. Использование одинарных кавычек делает escaping немного проще.

вам нужен знак доллара в конце строки, чтобы указать, что вы хотите, чтобы "zip" произошел в конце строки.

попробуй: grep -o -E "(\.([A-z])+)+"

я использовал это, чтобы получить многоточечные/несколько расширений. Итак, если вход был hello.tar.gz , тогда он выведет .tar.gz . Для одиночного пунктирного используйте grep -o -E "\.([A-z])+$" . Проверено на С Cygwin/MinGW в+префикса msys.

Я использую это, чтобы получить список типов файлов внутри папки.

мероприятия к примеру:

вы получите количество файлов:

еще одно исправление / аддон приведенного выше примера:

Это позволит получить файл расширения '.МР3 и т. д.

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

на . означает текущую папку. Если вы хотите указать папку, отличную от текущей папки, просто замените . путь к папке. Вот пример: Давайте найдем все файлы, которые заканчиваются на .gz и находятся в папке/var / log

вывод примерно такой:

на $ подписать в основном статистику, что расширение файла заканчивается на gz

" $ " указывает на конец строки

Иногда бывают ситуации, когда нужно просканировать всю файловую систему Linux и найти все файлы, содержащие определённую строку текста. То есть нужно выполнить поиск не по имени файла, а по содержимому текстового файла.

Пример таких ситуаций из практики:

Пример — поиск заголовка Strict-Transport-Security в директории конфигурационных файлов веб-сервера:


Одним из лучших вариантов поиска всех файлов, содержащих заданный текст, является команда:

В этой команде используются следующие опции:

-r (также можно использовать -R) для рекурсивного поиска — то есть поиск будет выполнен в папке и подпапках. Опция -R делает так, что программа следует по символическим ссылкам, если натыкается на них, соответственно, с опцией -r этого не происходит. Но поиск является рекурсивным в обоих случаях

-n означает выводить номера строку (чтобы быстрее найти в них нужное место)

-w используется для поиска по полным словам. При использовании опции -w будут выбраны только строки, которые содержат совпадения целых слов. То есть для того, чтобы совпадение засчиталось, совпавшая подстрока быть либо вначале строки, либо перед ней должен идти несловесный составной символ. Аналогично она должна быть либо в конце строки, либо за ней должен следовать несловесный составной символ. Словесными составными символами являются буквы, цифры и подчёркивание. Соответственно, несловесными являются все остальные: пробелы, знаки препинания, дефисы и прочее.

Эти опции являются оптимальными, но, на самом деле, для поиска по всей директории вместе с вложенными поддиректориями, либо по всей файловой системе, достаточно использовать только опцию -r, а остальные можно пропустить.

Рассмотрим ещё несколько опций, которые могут оказаться весьма полезными:

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

-l (маленькая L) подавляет нормальный вывод; вместо него выводится имя каждого файла, в котором найдено совпадение. То есть по умолчанию выводиться совпавшая строка, а с этой опцией будут выводиться только имена файлов, в которых найдена строка. Сканирование будет остановлено после первого совпадения.

--color[=КОГДА], --colour[=КОГДА] — используется для подсветки в терминале совпавшей подстроки, контекстных строк, имён файлов, номеров строк, байтового смещения и разделителей (для полей и групп контестных строк). КОГДА можно указывать или не указывать по жоеланию. В качестве КОГДА может быть never (никогда), always (всегда) или auto (автоматически).

-I — пропускать бинарные файлы. При рекурсивной обработке могут попадаться не текстовые файлы, натыкаясь на которые grep будет показывать предупреждения. Эта опция делает обработку бинарных файлов такой, как если бы они не содержали совпадающих данных.

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

Ещё один вариант — использовать опцию -F. Она будет интерпретировать ШАБЛОНЫ как фиксированные строки, а не как регулярные выражения. С одной стороны, команда grep потеряет часть своей гибкости, но при этом вы получите более предсказуемый результат, если вы не понимаете регулярные выражения.

В зависимости от обстоятельств, можно использовать для повышения эффективности поиска следующие флаги:

--exclude=GLOB — означает пропустить файлы, с именем суффикса, которое совпадёт с шаблоном GLOB. Имя суффикса это как полное имя, так и любой суффикс, начинающийся после / и перед не-/ (то есть между слэшей в пути имени файла). При рекурсивном поиске, пропускаются все подфайлы, чьё базовое имя совпадает с GLOB. Базовое имя — это часть после последнего слэша (/). Шаблон GLOB поддерживает несколько подстановочных символов. Шаблон (GLOB) может использовать в качестве подстановочных символов * (означает последовательность нуля или более символов), ? (означает ровно один символ), и [СИМВОЛЫ] (означает любой один из СИМВОЛОВ), (означает любой из символов), а также \ для экранирования подстановочных символов или символа обратного слэша, чтобы они начали восприниматься буквально.

--include=GLOB — искать только файлы, чьё базовое имя совпадает с GLOB (можно использовать подстановочные символы, как описано чуть выше)

--exclude-dir=GLOB — пропустить директории с суффиксом имени, которые совпадает с шаблоном GLOB. При рекурсивном поиски, пропуск любых поддиректорий, чьё базовое имя совпадает с GLOB. Любые избыточные конечные слэши в GLOB игнорируются.

Чтобы было понятнее, рассмотрим примеры. Допустим мы хотим выполнить поиск только по файлам с расширениями .c или .h:

В этой команде * (звёздочка) означает любое имя файла. Но эта звёздочка экранирована, поскольку для терминала она также имеет особое значение. В этом имене должна идти точка и буква c или h.

Следующий поиск исключит из результатов все файлы, которые заканчиваются на расширение .o:

Для директорий возможно исключить конкретную директорию(ии) через параметр --exclude-dir. Например, следующая команда исключит dirs dir1/, dir2/ и все другие директории соответствующие *.dst/:

Найти все файлы с расширением в Linux

Советы и хитрости

Часто мы оказываемся в тупике, когда нам нужно найти все файлы с одинаковыми или разными расширениями. Скорее всего, это произошло с различными пользователями Linux при использовании терминала. Одно дело искать один тип файла или файл, но что вы будете делать, если захотите найти все файлы одновременно? Эта статья приходит на помощь нашим читателям, у которых возникла такая дилемма.

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

Одним из самых мощных инструментов поиска файлов в системе Linux является «команда find». Он ищет во всем каталоге файлы и папки, чтобы сопоставить их с выражением пользователя, и выполняет действия с этими файлами. Разрешение файла, размер файла, тип — это некоторые другие факторы, основанные на поиске файлов в Linux. Команду Find также можно комбинировать с другими утилитами, такими как sed или grep. Теперь давайте перейдем к практическому применению команды find.

Найдите синтаксис команды:

Поиск всех файлов с одним расширением

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

«.» в этой команде означает, что этот инструмент найдет все файлы «.txt» в текущем каталоге.

в этой команде означает, что этот инструмент найдет все файлы

в этой команде означает, что этот инструмент найдет все файлы2

в этой команде означает, что этот инструмент найдет все файлы3

Найдите файлы «.exe» в той же команде поиска, добавив расширение как «* exe».

Найдите файлы «.exe» в той же команде поиска, добавив расширение

Найдите файлы «.exe» в той же команде поиска, добавив расширение2

Найдите файлы «.exe» в той же команде поиска, добавив расширение3

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

Файлы конфигурации также являются важной частью любой файловой системы

Файлы конфигурации также являются важной частью любой файловой системы

Файлы конфигурации также являются важной частью любой файловой системы3

Поиск файлов с несколькими расширениями

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

Выполнение приведенной ниже команды приведет к получению файлов с расширениями «.sh» и «.txt».

Выполнение приведенной ниже команды приведет к получению файлов с расширениями

Выполнение приведенной ниже команды приведет к получению файлов с расширениями2

Выполнение приведенной ниже команды приведет к получению файлов с расширениями3

Команда locate — более быстрый и лучший инструмент по сравнению с командой find. Когда файл инициируется, вместо поиска в файловой системе найдите и используйте базу данных для поиска. Эта база данных хранит части и биты информации, относящейся к файлам и их адресам в вашей системе.

найдите синтаксис команды:

При поиске файла с определенным расширением, например «.conf», которое рассматривается в нашем случае, добавляется путь к каталогу, в котором будет происходить процесс поиска файлов.

При поиске файла с определенным расширением, например «.conf»

При поиске файла с определенным расширением, например «.conf»

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

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

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

Точно так же вы можете следовать синтаксису команды locate

Точно так же вы можете следовать синтаксису команды locate для поиска всех файлов с любым конкретным расширением, например «.txt».

для поиска всех файлов с любым конкретным расширением, например «.txt»

для поиска всех файлов с любым конкретным расширением, например «.txt»2

Заключение

В этом посте рассматриваются две мощные, но простые утилиты, с помощью которых вы можете найти все файлы с одинаковыми или разными расширениями. Мы предоставили вам фундаментальные концепции, касающиеся команд «найти» и «найти», и показали, как использовать эти два инструмента командной строки Linux для поиска всех файлов с несколькими расширениями.

Читайте также: