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