Отрицательное совпадение в grep

Быстрые ссылки
- Отрицательное совпадение с grep
- Отрицательное совпадение для имён файлов
grep — утилита командной строки в Linux для поиска строк в файлах по шаблону или регулярному выражению. Часто нужно не найти совпадения, а наоборот — отфильтровать их: показать только строки, которые НЕ содержат заданную подстроку или шаблон.
Отрицательное совпадение с grep
Чтобы инвертировать совпадение в grep, используйте флаг -v или полную форму:
--invert-matchЭто заставит grep печатать только те строки, которые не соответствуют заданному шаблону:
grep -v "bar" file
Важно: при инверсии совпадения опция -o (печатать только совпавшие фрагменты) не имеет смысла — ведь совпадений нет. grep пропускает строку при любом совпадении; если в строке есть хотя бы одно совпадение, строка будет исключена из вывода.
Это работает и с регулярными выражениями. Например:
grep -v "foo ba[rz]" fileХотя существуют более сложные регулярные приёмы для выражения «не совпадает», обычно проще и понятнее инвертировать результат с помощью -v.
Альтернатива на awk:
awk '!/bar/' file
Отрицательное совпадение для имён файлов
Флаг -l печатает имена файлов, где есть совпадения вместо самих строк. Обратный вариант — -L — печатает имена файлов, которые НЕ содержат совпадение:
grep -L "bar" ./*.txtНе используйте одновременно -v и -L, иначе получится двойная инверсия, и результат будет не совпадать с ожидаемым.
Частые ошибки и когда инверсия не помогает
- Двоичная или сжатая часть файла: grep может пропустить то, что вы ожидаете. Используйте –binary-files=text или фильтруйте по расширению.
- Поиск по словам: если нужно исключить целое слово, используйте границы слова (-w) вместе с -v.
- Многофайловый вывод: при большом числе файлов лучше применять -r или –exclude-dir, чтобы избежать лишней рекурсии.
- Если нужно исключить строки по нескольким шаблонам, комбинируйте с -E или используйте файл шаблонов (-f).
Полезные примеры
Показать все строки, не содержащие «TODO» (чувствительность к регистру):
grep -v "TODO" project/*.mdПоказать все строки, не содержащие «error» независимо от регистра:
grep -vi "error" logfileИсключить строки, содержащие любое из нескольких слов:
grep -vE "(debug|trace|verbose)" app.logИсключить файлы, которые не содержат шаблон в дереве каталогов:
grep -rL "TODO" src/Альтернатива — быстрый поиск с ripgrep (rg):
rg -v "pattern"rg по умолчанию быстрее в больших репозиториях и умеет игнорировать .gitignore.
Методология применения (мини-процесс)
- Определите шаблон, который нужно исключить.
- Проверьте чувствительность к регистру и необходимость границ слова.
- Запустите grep -v сначала на тестовом файле.
- При положительном результате масштабируйте команду на каталог с -r или шаблоном файлов.
- При больших наборах данных подумайте об rg или awk для производительности.
Контрольный список для системного администратора
- Шаблон проверен на тестовом файле.
- Указан правильный флаг регистра (-i) при необходимости.
- Если нужно — исключены бинарные файлы.
- Для рекурсивного поиска задана корректная глубина или исключения.
- Нет одновременного использования -v и -L.
Критерии приёмки
- Команда возвращает только строки без указанного шаблона.
- Для поиска файлов команда возвращает список ожидаемых файлов при -L.
- Для многопараметрического исключения поведение совпадает с регулярным выражением.
Краткая памятка по синтаксису
- -v, –invert-match — инвертировать совпадение
- -L — показать файлы, не содержащие совпадений
- -l — показать файлы, содержащие совпадения
- -i — игнорировать регистр
- -E — расширенные регулярные выражения
Решение задач: быстрый диаграмм выбора
flowchart TD
A[Нужны строки без шаблона?] -->|Да| B{Требуется список файлов?}
B -->|Да| C[Используйте grep -L]
B -->|Нет| D[Используйте grep -v]
A -->|Нет| E[Обычный grep]Глоссарий
- Регулярное выражение — шаблон для поиска текста.
- Инверсия — вывод элементов, которые не соответствуют условию.
Итог
- -v инвертирует совпадение и выводит строки без шаблона.
- -L печатает имена файлов без совпадений.
- Для производительных или сложных сценариев рассмотрите rg, awk или составные регулярные выражения.
Важно: не комбинируйте -v и -L — это приведёт к двойной инверсии и неожидаемому результату.
Summary:
- grep -v фильтрует строки, не содержащие шаблон.
- grep -L выводит файлы без совпадений.
- Проверяйте регистр и тип файлов при применении команд.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента