Введение
grep
— это мощный инструмент командной строки, который используется для поиска в одном или нескольких входных файлах строк, соответствующих регулярному выражению, и записывает каждую соответствующую строку в стандартный вывод.
В этой статье мы покажем вам, как исключить одно или несколько слов, шаблонов или каталогов при поиске с помощью grep
.
Исключить слова и шаблоны
Чтобы отобразить только строки, не соответствующие шаблону поиска, используйте параметр -v
(или --invert-match
).
Например, чтобы напечатать строки, не содержащие строку nologin
, вы должны использовать:
grep -wv nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
git:x:994:994:git daemon user:/:/usr/bin/git-shell
noviello:x:1000:1000:noviello:/home/noviello:/bin/bash
Параметр -w
позволяет grep
возвращать только те строки, в которых указанная строка является целым словом (заключенным не буквенно-цифровыми символами).
По умолчанию grep
чувствителен к регистру. Это означает, что прописные и строчные символы рассматриваются как разные. Чтобы игнорировать регистр при поиске, вызовите grep
с параметром -i
.
Если строка поиска содержит пробелы, она должна быть заключена в одинарные или двойные кавычки.
Чтобы указать два или более шаблонов поиска, используйте параметр -e
:
grep -wv -e nologin -e bash /etc/passwd
Вы можете использовать опцию -e
так часто, как хотите.
Другой способ исключить несколько шаблонов поиска — объединить шаблоны с помощью оператора ИЛИ |
.
В следующем примере выводятся строки, не содержащие nologin
или bash
:
grep -wv 'nologin\|bash' /etc/passwd
GNU grep
поддерживает три синтаксиса регулярных выражений: базовый, расширенный и Perl-совместимый. По умолчанию grep
интерпретирует шаблон как базовое регулярное выражение, где |
они теряют свое особое значение, и вы должны использовать их версии с обратной косой чертой.
Если вы используете параметр расширенного регулярного выражения -E
, вам не нужно экранировать оператор |
, как показано ниже:
grep -Ewv 'nologin|bash' /etc/passwd
Вы можете указать несколько возможных совпадений, которые могут быть литеральными строками или наборами выражений. В следующем примере исключаются games
строки, в которых строка находится в начале строки:
grep -v "^games" file.txt
Вывод команды может быть отфильтрован с помощью grep
через конвейер, и только строки, соответствующие определенному шаблону, будут напечатаны на терминале.
Например, чтобы распечатать все процессы, запущенные в вашей системе, кроме тех, которые запущены от имени пользователя «root», вы можете отфильтровать вывод команды ps
:
ps -ef | grep -wv root
Исключить каталоги и файлы
Иногда при выполнении рекурсивного поиска с параметрами -r
или -R
можно исключить определенные каталоги из результатов поиска.
Основное различие между параметрами -r
и -R
заключается в том, что при вызове grep в верхнем регистре R
он будет следовать по всем символическим ссылкам.
Чтобы исключить каталог из поиска, используйте параметр --exclude-dir
. Путь к исключенному каталогу указан относительно каталога поиска.
Вот пример, показывающий, как искать строку noviello
во всех файлах внутри /etc
, за исключением каталога /etc/pki
:
grep -R --exclude-dir=pki noviello /etc
Чтобы исключить несколько каталогов, заключите исключенные каталоги в фигурные скобки и разделите их запятыми без пробелов.
Например, чтобы найти файлы, содержащие строку «GNU» в вашей системе Linux, за исключением каталогов proc
, boot
и sys
, вы должны запустить:
grep -r --exclude-dir={proc,boot,sys} gnu /
При использовании сопоставления с подстановочными знаками вы можете исключить файлы, базовое имя которых совпадает с GLOB, указанным в параметре --exclude
.
В приведенном ниже примере мы ищем строку во всех файлах в текущем рабочем каталоге noviello
, за исключением файлов, оканчивающихся на .png
и .jpg
:
grep -rl --exclude=*.{png,jpg} noviello *
Вывод
Команда grep
позволяет исключить шаблоны и каталоги при поиске файлов.