Поиск по сайту:

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


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

Команда grep

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

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

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

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

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

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

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

cat jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock" jabberwocky.text

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

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

grep -v "Jabberwock" jabberwocky.text

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

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

grep -v -e "Jabberwock" -e "and" jabberwocky.txt

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

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

grep -Ev "Jabberwock|and" jabberwocky.txt

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

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

grep -Ev "^ACHT" jabberwocky.txt

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

grep "Jabberwock" jabberwocky.txt | grep -v "slain"

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

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

grep "vorpal" verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt

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

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

grep "vorpal" *.txt

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

grep "sword" *.txt

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

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

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

grep --exclude=vol-log-1.txt "sword" *.txt

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

grep --exclude=vol*.txt "sword" *.txt

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

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

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

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

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

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

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

grep -R --exclude-dir=backup "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=backup/archive "frumious" /home/dave/data

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

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