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 andreyex:x:1000:1000:andreyex:/home/andreyex:/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 вы можете захотеть исключить определенные каталоги из результатов поиска.
Чтобы исключить каталог из поиска, воспользуйтесь опцией —exclude-dir. Путь к исключенному каталогу относительно каталога поиска.
Вот пример, показывающий, как искать строку andreyex во всех файлах внутри /etc, за исключением каталога /etc/pki:
grep -R --exclude-dir=pki andreyex /etc
Чтобы исключить несколько каталогов, заключите исключенные каталоги в фигурные скобки и разделите их запятыми без пробелов.
Например, чтобы найти файлы , которые содержат строку «gnu» в вашей системе Linux исключая proc, bootи sysкаталоги , которые вы бы запустить:
grep -r --exclude-dir={proc,boot,sys} gnu /
При использовании сопоставления с подстановочными знаками вы можете исключить файлы, базовое имя которых совпадает с GLOB, указанным в опции —exclude.
В приведенном ниже примере мы ищем строку во всех файлах в текущем рабочем каталоге, за исключением файлов andreyex, оканчивающихся на .pngи .jpg:
grep -rl --exclude=*.{png,jpg} andreyex *
Команда grepпозволяет исключить шаблоны и каталоги при поиске файлов.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!
Спасибо! Ваша заявка принята
Спасибо! Ваша заявка принята
Как заставить вывести строки, содержащие одно, но одновременно не содержащие другое слово?
Например, из лога вывеси все строки, содержащие err и wrn, но пропускать строки с «wrn … xxx» и «err … yyy». Нужно одной командой, через регулярные выражения. grep wrn | grep -v xxx не подойдёт для zabbix