Как исключить шаблоны, файлы и каталоги с помощью grep
Опубликовано: 2022-06-29
С 1974 года команда Linux grep
помогает людям находить строки в файлах. Но иногда grep
слишком тщательный. Вот несколько способов заставить grep
игнорировать разные вещи.
Команда grep
Команда grep
ищет в текстовых файлах строки, соответствующие шаблонам поиска, указанным в командной строке. Сила grep
заключается в использовании регулярных выражений. Они позволяют вам описать то, что вы ищете, вместо того, чтобы явно определять это.
Рождение grep
предшествовало Linux. он был разработан в начале 1970-х годов для Unix. Он получил свое название от последовательности клавиш g/re/p в редакторе строк ed
(кстати, произносится как «ee-dee»). Это означало глобальный, регулярный экспресс-поиск, печать совпадающих строк.
grep
известен — возможно, печально известен — тщательным и целеустремленным. Иногда он будет искать файлы или каталоги, на которые вы бы предпочли не тратить время, потому что результаты могут лишить вас возможности увидеть лес за деревьями.
Конечно, есть способы управлять grep. Вы можете указать ему игнорировать шаблоны, файлы и каталоги, чтобы grep выполнял поиск быстрее, и вы не были завалены бессмысленными ложными срабатываниями.
Исключение шаблонов
Для поиска с помощью grep
вы можете направить в него ввод из какого-либо другого процесса, такого как cat
, или вы можете указать имя файла в качестве последнего параметра командной строки.
Мы используем короткий файл, содержащий текст стихотворения « Бармаглот » Льюиса Кэрролла. В этих двух примерах мы ищем строки, соответствующие поисковому запросу «Бармаглот».
кот бармаглот.txt | grep "Бармаглот"
grep "Бармаглот" jabberwocky.text
Строки, которые содержат совпадения с подсказкой поиска, перечислены для нас, при этом соответствующий элемент в каждой строке выделен красным цветом. Это прямой поиск. Но что, если мы хотим исключить строки, содержащие слово «Бармаглот», и напечатать остальные?
Мы можем добиться этого с помощью опции -v
(инвертировать совпадение). Здесь перечислены строки, которые не соответствуют поисковому запросу.
grep -v "Бармаглот" jabberwocky.text
Строки, не содержащие «Бармаглот», отображаются в окне терминала.
Мы можем исключить столько терминов, сколько пожелаем. Давайте отфильтруем все строки, содержащие «Бармаглот», и все строки, содержащие «и». Для этого мы будем использовать параметр -e
(выражение). Нам нужно использовать его для каждого шаблона поиска, который мы используем.
grep -v -e "Бармаглот" -e"и"jabberwocky.txt
Соответствующее уменьшение количества строк в выводе.
Если мы используем параметр -E
(расширенные регулярные выражения), мы можем комбинировать шаблоны поиска с « |
“, который в данном контексте не указывает на канал, это логический оператор OR
.
grep -Ev "Бармаглот|и" jabberwocky.txt
Мы получаем точно такой же вывод, как и с предыдущей, более длинной командой.
Формат команды такой же, если вы хотите использовать шаблон регулярного выражения вместо явной подсказки поиска. Эта команда исключит все строки, начинающиеся с любой буквы из набора «ACHT».
grep -Ev "^ACHT" jabberwocky.txt
Чтобы увидеть строки, которые содержат шаблон, но не содержат другого шаблона, мы можем передать grep
в grep
. Мы будем искать все строки, содержащие слово «бармаглот», а затем отфильтруем все строки, которые также содержат слово «убит».
grep "Бармаглот" jabberwocky.txt | grep -v "убит"

Исключение файлов
Мы можем попросить grep
искать строку или шаблон в наборе файлов. Вы можете перечислить каждый файл в командной строке, но со многими файлами такой подход не масштабируется.
grep "vorpal" стих-1.txt стих-2.txt стих-3.txt стих-4.txt стих-5.txt стих-6.txt
Обратите внимание, что имя файла, содержащего совпадающую строку, отображается в начале каждой строки вывода.
Чтобы сократить ввод, мы можем использовать подстановочные знаки. Но это может быть контринтуитивно. Кажется, это работает.
grep "ворпал" *.txt
Однако в этом каталоге есть и другие TXT-файлы, не имеющие никакого отношения к стихотворению. Если мы будем искать слово «меч» с той же структурой команды, мы получим много ложных срабатываний.
grep "меч" *.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-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