Linux grep исключение из поиска
Я хочу просмотреть все подкаталоги, кроме каталога "node_modules".
Решение 1 (объединить find и grep )
цель этого решения - не иметь дело с grep производительность, но чтобы показать портативное решение : также следует работать с busybox или GNU версии старше 2.5.
использовать find , для исключения каталогов foo и bar:
затем объединить find и нерекурсивное использование grep , как портативное решение :
решение 2 (рекурсивное использование grep ):
вы уже знаете это решение, но я добавляю его, так как это самое последнее и эффективное решение. Обратите внимание, что это менее портативное решение, но более удобочитаемое.
решение 3 (Ag)
если вы часто поиск через код Ag (Серебряный Искатель) гораздо более быстрая алтернатива к grep, то подгоняно для поиск кода. Например, он автоматически игнорирует файлы и каталоги, перечисленные в .gitignore , поэтому вам не нужно продолжать передавать те же громоздкие опции исключения в grep или find .
который исключает каталоги, соответствующие шаблону dir из рекурсивного поиска в каталоге.
так что вы можете сделать:
для получения дополнительной информации о синтаксисе и использовании см.
- man-страница GNU для выбор файла и каталога
- связанный ответ StackOverflow используйте grep --exclude/--include синтаксис, чтобы не grep через определенные файлы
для старых GNU Greps и POSIX Grep используйте find как указано в другие ответы.
или просто использовать ack (редактировать или Серебряный Искатель) и покончим с этим!
Если вы хотите исключить несколько каталогов :
" r " для рекурсивных," l "печатать только имена файлов, содержащих совпадения и" i " игнорировать различия регистров :
пример : я хочу найти файлы, содержащие слово 'привет'. Я хочу искать во всех моих каталогах linux за исключением proc, boot, sys и root каталог :
Примечание: пример выше должен быть root
примечание 2 (согласно @skplunkerin): не добавляйте пробелы после запятых в
расширяется оболочкой (например, Bash), а не grep в этого:
цитирование предотвратит расширение оболочки, поэтому это не сработает:
шаблоны с --exclude-dir те же самые шаблоны, описанные на странице man для :
оболочка будет вообще попробовать чтобы расширить сам такой шаблон, поэтому, чтобы избежать этого, вы должны цитирую:
вы можете использовать фигурные скобки и процитированные шаблоны исключения вместе, как это:
шаблон может охватывать несколько сегментов пути:
это исключило бы каталог, такой как topdir/something/else .
часто использовать этот:
grep может использоваться в сочетании с -r (рекурсивный), i (игнорировать регистр) и -o (печать только соответствующей части строк). Исключить files использовать --exclude и для исключения каталогов используйте --exclude-dir .
собирая его вместе, вы в конечном итоге получаете что-то вроде:
описывая его, это звучит намного сложнее, чем на самом деле. Проще проиллюстрировать простым образец.
пример:
предположим, я ищу текущий проект для всех мест, где я явно задал строковое значение debugger во время сеанса отладки, а сейчас хотите просмотреть / удалить.
Я пишу сценарий под названием findDebugger.sh и использовать grep найти все вхождения. Однако:
для исключений файлов-я хочу убедиться, что .eslintrc игнорируется (это на самом деле есть правило пылеобразования о debugger так должно быть исключенный.) Аналогично, я не хочу, чтобы мой собственный сценарий упоминался в каких-либо результатах.
для исключений каталога-я хочу исключить node_modules поскольку он содержит множество библиотек, которые ссылаются debugger и меня не интересуют эти результаты. Также я просто хочу опустить .idea и .git скрытые каталоги, потому что я тоже не забочусь об этих местах поиска и хочу сохранить производительность поиска.
grep - это мощный инструмент командной строки, который используется для поиска в одном или нескольких входных файлах строк, соответствующих регулярному выражению, и записывает каждую совпадающую строку в стандартный вывод.
Исключить слова и шаблоны
Чтобы отображать только те строки, которые не соответствуют поисковому шаблону, используйте параметр -v (или --invert-match ).
Например, чтобы напечатать строки, которые не содержат строку, nologin вы должны использовать:
-w Опция говорит grep вернуть только те строки , где указанная строка представляет собой целое слово (заключенные символы без слов).
По умолчанию учитывается grep регистр. Это означает, что символы верхнего и нижнего регистра рассматриваются как разные. Чтобы игнорировать регистр при поиске, вызовите grep с -i опцией.
Если строка поиска содержит пробелы, вам необходимо заключить ее в одинарные или двойные кавычки.
Чтобы указать два или более шаблонов поиска, используйте -e опцию:
Вы можете использовать эту -e опцию сколько угодно раз.
Другой вариант исключения нескольких шаблонов поиска - объединение шаблонов с помощью оператора ИЛИ | .
В следующем примере печатаются строки, не содержащие строк nologin или bash :
GNU grep поддерживает три синтаксиса регулярных выражений: базовый, расширенный и совместимый с Perl. По умолчанию grep интерпретирует шаблон как базовое регулярное выражение, в котором метасимволы, например, | теряют свое особое значение, и вы должны использовать их версии с обратной косой чертой.
Если вы используете опцию расширенного регулярного выражения -E , то оператор | не следует экранировать, как показано ниже:
Вы можете указать различные возможные совпадения, которые могут быть буквальными строками или наборами выражений. В следующем примере games исключаются строки, в которых строка находится в самом начале строки:
Вывод команды может быть отфильтрован grep через конвейер, и на терминале будут напечатаны только строки, соответствующие заданному шаблону.
Например, чтобы распечатать все запущенные процессы в вашей системе, кроме тех, которые выполняются как пользователь «root», вы можете отфильтровать вывод ps команды:
Исключить каталоги и файлы
Иногда при выполнении рекурсивного поиска с опциями -r или -R вы можете захотеть исключить определенные каталоги из результатов поиска.
Основное различие между параметрами -r или -R заключается в том, что когда grep вызывается с прописными буквами, R он будет следовать всем символическим ссылкам.Чтобы исключить каталог из поиска, воспользуйтесь --exclude-dir опцией. Путь к исключенному каталогу относительно каталога поиска.
Вот пример, показывающий, как искать строку baksdev во всех файлах внутри /etc , за исключением /etc/pki каталога:
Чтобы исключить несколько каталогов, заключите исключенные каталоги в фигурные скобки и разделите их запятыми без пробелов.
Например, чтобы найти файлы , которые содержат строку «Гну» в вашей системе Linux исключая proc , boot и sys каталоги , которые вы бы запустить:
При использовании сопоставления с подстановочными знаками вы можете исключить файлы, базовое имя которых совпадает с GLOB, указанным в --exclude опции.
В приведенном ниже примере мы ищем строку во всех файлах в текущем рабочем каталоге, за baksdev исключением файлов, оканчивающихся на .jpg и .jpg :
В этой статье мы покажем вам, как исключить одно или несколько слов, шаблонов или каталогов при поиске с помощью grep.
Исключить слова и шаблоны
Например, чтобы напечатать строки, которые не содержат строку, nologinвы должны использовать:
Опция -w говорит grepвернуть только те строки, где указанная строка представляет собой целое слово (заключенные символы без слов).
По умолчанию учитывается регистр grep. Это означает, что символы верхнего и нижнего регистра рассматриваются как разные. Чтобы игнорировать регистр при поиске, вызовите grep с опцией -i.
Если строка поиска содержит пробелы, вам необходимо заключить ее в одинарные или двойные кавычки.
Чтобы указать два или более шаблонов поиска, используйте опцию -e:
Вы можете использовать опцию -e сколько угодно раз.
В следующем примере печатаются строки, не содержащие строк nologin или bash:
GNU grepподдерживает три синтаксиса регулярных выражений: базовый, расширенный и совместимый с Perl. По умолчанию grepинтерпретирует шаблон как базовое регулярное выражение, в котором метасимволы, например, | теряют свое особое значение, и вы должны использовать их версии с обратной косой чертой.
Если вы используете опцию расширенного регулярного выражения -E, то оператор | не следует экранировать, как показано ниже:
Вы можете указать различные возможные совпадения, которые могут быть буквальными строками или наборами выражений. В следующем примере исключаются строки games, в которых строка находится в самом начале строки:
Вывод команды может быть отфильтрован grepчерез конвейер, и только строки, соответствующие заданному шаблону, будут напечатаны на терминале.
Например, чтобы распечатать все запущенные процессы в вашей системе, кроме тех, которые выполняются от имени пользователя «root», вы можете отфильтровать вывод команды ps:
Исключить каталоги и файлы
Иногда при выполнении рекурсивного поиска с опциями -r или -R вы можете захотеть исключить определенные каталоги из результатов поиска.
Основное различие между параметрами -r или -R заключается в том, что когда grep вызывается с прописными буквами, Rон будет следовать всем символическим ссылкам.Вот пример, показывающий, как искать строку andreyex во всех файлах внутри /etc, за исключением каталога /etc/pki:
Чтобы исключить несколько каталогов, заключите исключенные каталоги в фигурные скобки и разделите их запятыми без пробелов.
Например, чтобы найти файлы , которые содержат строку «gnu» в вашей системе Linux исключая proc, bootи sysкаталоги , которые вы бы запустить:
В приведенном ниже примере мы ищем строку во всех файлах в текущем рабочем каталоге, за исключением файлов andreyex, оканчивающихся на .jpgи .jpg:
Заключение
Команда grepпозволяет исключить шаблоны и каталоги при поиске файлов.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Я часто использую рекурсивный grep для поиска исходных файлов с конкретным контентом.
На больших кодовых базах это может быть медленным, поэтому я использую --incldue для ограничения расширений / белых списков.
Тем не менее, было бы более эффективно исключить (удалить) целые подкаталоги, я думаю:
Но --exclude поддерживает только шаблоны файлов, такие как * .java выше. Как я могу исключить каталоги?
Вы можете посмотреть в АСК .
Я только начал использовать это, но это кажется подходящим для этого.
Ack выглядит довольно хорошо. Приятно, что он интуитивно исключает ненужные файлы. опция --nogroup дает аналогичный вывод для grep -Rni Ack немного медленный. Вы можете попробовать Серебряный Искатель (Ag) или ripgrep (rg). Обратите внимание, что это рекурсивно исключает. ./dev будут исключены ПОСЛЕ ./foo/bar/dev . Используйте --exclude-dir=./dev только для первого случая. Вы также можете немного сократить это, используя globbing: bash grep -r --exclude-dir=вы можете использовать вместо поиска:
Итак, это немного задом наперед, сначала вы получите результаты grep, а затем путь. Может быть, у кого-то еще есть лучший ответ?
хорошо, мне это очень нравится. конечно найти намного гибче. единственная разница между выходными данными состоит в том, что «grep -Rni» будет печатать имя файла для каждого совпадения, тогда как «find -exec grep» будет печатать имя файла в одной строке, а затем по одной строке для каждого соответствия (с номером строки и содержимым строки ). использование «grep -Hni» заставляет имя файла отображаться в каждой строке Спасибо за предоставленный единственный ответ, который работал для систем, которые являются такими хрустящими, без grep --exclude-dir, но все еще должны работатьВот полный пример скрипта в одном из моих проектов, который может помочь, я называю этот файл «all_source» (помеченный как исполняемый файл) и помещаю его в корневой каталог моего проекта, затем называю его grep myfunc $(./all_source) сортировкой в конце скрипта полностью по желанию.
Этот скрипт возвращает все имена файлов в проекте, которые совпадают *.h, *.cpp, *.c, *.lua, *.*awk , но не выполняет поиск во всех папках с именами .svn и gen, а также пропускает папки ./lib и ./vc6 (но только те, которые находятся прямо в корне проекта). Поэтому, когда вы делаете grep myfunc $(./all_source) это только greps в этих файлах. Вам также нужно будет вызвать это из корневого каталога проекта.
Мощь регулярных выражений в сочетании с поддерживаемыми опциями в grep делает это возможным.
Синтаксис команды
Grep ожидает шаблон и необязательные аргументы вместе со списком файлов, если они используются без конвейера.
1. Поиск в нескольких файлах
Grep позволяет искать заданный шаблон не только в одном, но и в нескольких файлах с помощью масок (например, знака «*»):
Из приведенного вывода можно заметить, что grep печатает имя файла перед соответствующей строкой, чтобы указать местонахождение шаблона.
2. Поиск без учета регистра
G rep предлагает искать паттерн, не глядя на его регистр. Используйте флаг -i, чтобы утилита игнорировала регистр:
3. Поиск всего слова
Зачастую вместо частичного совпадения необходимо полное соответствие поисковому слову. Это можно сделать, используя флаг -w:
4. Проверка количества совпадений
Иногда вместо фактического совпадения со строкой нам необходимо количество успешных совпадений, найденных grep. Этот результат можно получить, используя опцию -c:
5. Поиск в подкаталогах
Часто требуется выполнить поиск файлов не только в текущем рабочем каталоге, но и в подкаталогах. G rep позволяет это сделать с помощью флага -r:
Как можно заметить, grep проходит через каждый подкаталог внутри текущего каталога и перечисляет файлы и строки, в которых найдено совпадение.
6. Инверсивный поиск
Если вы хотите найти что-то несоответствующее заданному шаблону, grep и это умеет при помощи флага -v:
Можно сравнить вывод команды grep по одному и тому же шаблону и файлу с флагом -v или без него. С флагом печатается каждая строка, которая не соответствует шаблону.
7. Печать номеров строк
Если хотите напечатать номера найденных строк, чтобы узнать их позицию в файле, используйте опцию -n:
8. Ограниченный вывод
Для больших файлов вывод может быть огромным и тогда вам понадобится фиксированное количество строк вместо всей простыни. Можно использовать -m[num]:
Обратите внимание, как использование флага влияет на вывод для того же набора условий:
9. Отображение дополнительных строк
Иногда необходимо вывести не только строки по некоторому шаблону, но и дополнительные строки выше или ниже найденных для понимания контекста. Можно напечатать строку выше, ниже или оба варианта, используя флаги -A, -B или -C со значением num (количество дополнительных строк, которые будут напечатаны). Это применимо ко всем совпадениям, которые grep находит в указанном файле или в списке файлов.
Ниже показан обычный вывод grep , а также вывод с флагами. Обратите внимание, как grep интерпретирует флаги и их значения, а также изменения в соответствующих выходных данных:
- с флагом -A1 выведется 1 строка, следующая за основной;
- -B1 напечатает 1 строку перед основной;
- -C1 выведет по одной строке снизу и сверху.
10. Список имен файлов
Чтобы напечатать только имя файлов, в которых найден шаблон, используйте флаг -l:
11. Точный вывод строк
Если необходимо напечатать строки, которые точно соответствуют заданному шаблону, а не какой-то его части, применяйте в команде ключ -x:
В приведенном ниже примере file.txt содержится слово «support», а строки без точного совпадения игнорируются.
12. Совпадение по началу строки
Используя регулярные выражения, можно найти начало строки:
Обратите внимание, как использование символа «^» изменяет выходные данные. Знак «^» указывает начало строки, т.е. ^It соответствует любой строке, начинающейся со слова It. Заключение в кавычки может помочь, когда шаблон содержит пробелы и т. д.
13. Совпадение по концу строки
Эта полезная регулярка способна помочь найти по шаблону конец строки:
Обратите внимание, как меняется вывод, когда мы сопоставляем символ «.» и когда используем «$», чтобы сообщить утилите о строках, заканчивающихся на «.» (без тех, которые могут содержать символ посередине).
14. Файл шаблонов
Если у вас есть некий список часто используемых шаблонов, укажите его в файле и используйте флаг -f. Файл должен содержать по одному шаблону на строку.
В примере мы создали файл шаблонов pattern.txt с таким содержанием:
Чтобы это использовать, применяйте ключ -f:
15. Указание нескольких шаблонов
G rep позволяет указать несколько шаблонов с помощью -e:
16. Расширенные выражения
G rep поддерживает расширенные регулярные выражения или ERE (похожие на egrep) с использованием флага -E.
Использование ERE имеет преимущество, когда вы хотите рассматривать мета-символы как есть и не хотите заменять их строками. Использование -E с grep эквивалентно команде egrep.
Заключение
Приведенные выше примеры – лишь верхушка айсберга. G rep поддерживает целый ряд опций и может оказаться полезным инструментом в руках специалиста, который способен эффективно его использовать. Мы можем не только взять на вооружение приведенные выше примеры, но и комбинировать их, чтобы получить требуемый результат в различных условиях.
Для дальнейшего изучения утилиты и расширения кругозора стоит почитать мануал, выполнив в терминале команду man grep, или посетить страницу с официальной документацией .
Читайте также: