Как исключить шаблоны, файлы и каталоги с помощью grep

Опубликовано: 2022-06-29
Ноутбук Linux с приглашением bash
Фатмавати Ачмад Заэнури/Shutterstock.com

С 1974 года команда Linux grep помогает людям находить строки в файлах. Но иногда grep слишком тщательный. Вот несколько способов заставить grep игнорировать разные вещи.

Команда grep

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

Рождение grep предшествовало Linux. он был разработан в начале 1970-х годов для Unix. Он получил свое название от последовательности клавиш g/re/p в редакторе строк ed (кстати, произносится как «ee-dee»). Это означало глобальный, регулярный экспресс-поиск, печать совпадающих строк.

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

Как использовать команду grep в Linux
СВЯЗАННЫЕ Как использовать команду grep в Linux

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

Исключение шаблонов

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

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

 кот бармаглот.txt | grep "Бармаглот"
 grep "Бармаглот" jabberwocky.text 

Два разных способа поиска в одном и том же текстовом файле с помощью grep

Строки, которые содержат совпадения с подсказкой поиска, перечислены для нас, при этом соответствующий элемент в каждой строке выделен красным цветом. Это прямой поиск. Но что, если мы хотим исключить строки, содержащие слово «Бармаглот», и напечатать остальные?

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

 grep -v "Бармаглот" jabberwocky.text 

Использование параметра инвертированного поиска -v с grep

Строки, не содержащие «Бармаглот», отображаются в окне терминала.

Все строки, не содержащие слова бармаглот

Мы можем исключить столько терминов, сколько пожелаем. Давайте отфильтруем все строки, содержащие «Бармаглот», и все строки, содержащие «и». Для этого мы будем использовать параметр -e (выражение). Нам нужно использовать его для каждого шаблона поиска, который мы используем.

 grep -v -e "Бармаглот" -e"и"jabberwocky.txt 

Использование нескольких предложений поиска с grep

Соответствующее уменьшение количества строк в выводе.

Строки из текста, не соответствующие ни одному поисковому запросу

Если мы используем параметр -E (расширенные регулярные выражения), мы можем комбинировать шаблоны поиска с « | “, который в данном контексте не указывает на канал, это логический оператор OR .

 grep -Ev "Бармаглот|и" jabberwocky.txt 

Использование логического оператора ИЛИ с grep

Мы получаем точно такой же вывод, как и с предыдущей, более длинной командой.

Строки из текста, не соответствующие ни одному поисковому запросу

Формат команды такой же, если вы хотите использовать шаблон регулярного выражения вместо явной подсказки поиска. Эта команда исключит все строки, начинающиеся с любой буквы из набора «ACHT».

 grep -Ev "^ACHT" jabberwocky.txt 

Исключение файлов, начинающихся с определенных букв

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

 grep "Бармаглот" jabberwocky.txt | grep -v "убит" 

Конвейер grep в grep для фильтрации дважды

Исключение файлов

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

 grep "vorpal" стих-1.txt стих-2.txt стих-3.txt стих-4.txt стих-5.txt стих-6.txt 

Поиск по списку именованных файлов

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

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

 grep "ворпал" *.txt 

Использование подстановочных знаков для поиска в коллекции файлов

Однако в этом каталоге есть и другие TXT-файлы, не имеющие никакого отношения к стихотворению. Если мы будем искать слово «меч» с той же структурой команды, мы получим много ложных срабатываний.

 grep "меч" *.txt 

Поиск «меча» в коллекции TXT-файлов

Нужные нам результаты маскируются потоком ложных результатов из других файлов с расширением TXT.

Большой набор результатов ложных срабатываний

Слово «ворпал» ничему не соответствовало, но слово «меч» входит в слово «пароль», поэтому оно много раз встречалось в некоторых псевдолог-файлах.

Нам нужно исключить эти файлы. Для этого воспользуемся опцией --exclude . Чтобы исключить один файл с именем «vol-log-1.txt», мы использовали бы эту команду:

 grep --exclude=vol-log-1.txt "меч" *.txt

В этом случае мы хотим исключить несколько файлов журналов с именами, начинающимися с «vol». Синтаксис, который нам нужен:

 grep --exclude=vol*.txt "меч" *.txt 

Исключение файлов с подстановочными знаками

Когда мы используем параметр -R (разыменование-рекурсивный), grep будет искать нас во всем дереве каталогов. По умолчанию он будет искать все файлы в этих местах. Вполне может быть несколько типов файлов, которые мы хотим исключить.

Под текущим каталогом на этом тестовом компьютере есть вложенные каталоги, содержащие файлы журналов, файлы CSV и файлы MD. Это все типы текстовых файлов, которые мы хотим исключить. Мы могли бы использовать опцию --exclude для каждого типа файлов, но мы можем достичь желаемого более эффективно, сгруппировав типы файлов.

Эта команда исключает все файлы с расширениями CSV или MD, а также все файлы TXT, имена которых начинаются с «vol» или «log».

 grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "меч" /home/dave/data/ 

Использование нескольких предложений --exclude и группировок имен файлов

Исключение каталогов

Если файлы, которые мы хотим игнорировать, содержатся в каталогах, и в этих каталогах нет файлов, которые мы хотим найти, мы можем исключить эти каталоги целиком.

Концепция очень похожа на исключение файлов, за исключением того, что мы используем параметр --exclude-dir и называем каталоги, которые следует игнорировать.

 grep -R --exclude-dir=резервная копия "vorpal" /home/dave/data 

Исключение каталога из поиска

Мы исключили каталог «backup», но по-прежнему ищем в другом каталоге с именем «backup2».

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

 grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal" /home/dave/data 

Исключение двух каталогов из поиска

Мы также можем использовать группировки. Мы можем добиться того же результата более кратко:

 grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data 

Исключение каталогов с группировкой

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

 grep -R --exclude=*.{csv,md} --exclude-dir=резервная копия/архив "frumious" /home/dave/data 

Исключение типов файлов и каталогов в одной команде

Иногда это то, что вы упускаете

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

СВЯЗАННЫЕ С: Как использовать регулярные выражения (регулярные выражения) в Linux