Команда grep выбирает входные строки, совпадающие с шаблоном. Она умеет искать в именованных файлах или stdin, выводить контекст совпадений, считать выбранные строки и сообщать через код выхода, найдено ли совпадение.
Text-Fu · Урок 16
grep
Научитесь выбирать строки по фиксированным строкам или регулярным выражениям и интерпретировать результаты grep.
Поиск совпадающих строк в файле
Передайте шаблон, а затем один или несколько входных файлов:
$ grep 'fox' sample.txt
По умолчанию GNU grep интерпретирует шаблон как базовое регулярное выражение и выводит каждую выбранную строку. Заключайте шаблоны в кавычки, чтобы оболочка сначала не интерпретировала пробелы и метасимволы.
Используйте -F, если шаблон нужно считать фиксированной строкой, а не регулярным выражением:
$ grep -F 'price: $5.00' products.txt
Какая команда ищет в products.txt буквальный текст price: $5.00, не интерпретируя символы шаблона как синтаксис регулярного выражения?
Выбор синтаксиса шаблона
GNU grep предлагает три часто используемых режима шаблонов:
- По умолчанию: базовые регулярные выражения.
-E: расширенные регулярные выражения, включая операторы|,+и?без обратных косых черт.-F: фиксированные строки без операторов регулярных выражений.
Якоря ^ и $ обозначают начало и конец строки. Чтобы в текстовом списке найти имена файлов, оканчивающиеся буквальным суффиксом .txt:
$ grep -E '\.txt$' filenames.txt
Обратная косая черта делает точку буквальной; неэкранированная . в регулярном выражении совпадает с любым одним символом.
Какое расширенное регулярное выражение совпадает со строками, оканчивающимися буквальным суффиксом .txt?
Безопасная передача шаблонов
Используйте -e PATTERN, чтобы явно передать шаблон. Это особенно полезно, когда он начинается с -, поскольку одни кавычки не останавливают разбор параметров:
$ grep -e '-v' settings.conf
Параметр -e можно повторять, выбирая строки, совпавшие с любым указанным шаблоном. -f patterns.txt читает по одному шаблону из каждой строки файла.
Какая команда ищет в settings.conf шаблон -v, а не интерпретирует его как параметр?
Управление выбранным выводом
-i: игнорировать различия регистра.-n: добавлять к выбранным строкам номера.-v: выбирать несовпадающие строки.-c: выводить число выбранных строк для каждого входного файла.-o: выводить только каждую непустую совпавшую часть, а не всю выбранную строку.
Например, подсчитаем строки с fox, игнорируя регистр:
$ grep -ic 'fox' sample.txt
-c считает выбранные строки, а не общее число совпадений внутри них. Строка с fox fox добавляет к счёту единицу. Если нужно число неперекрывающихся вхождений в GNU grep, можно использовать конвейер grep -o PATTERN | wc -l.
В data.txt одна строка содержит error error, а две строки не совпадают. Что сообщит grep -c 'error' data.txt?
Фильтрация stdin и поиск в каталогах
Если входной файл не указан, grep читает stdin и естественно работает в конвейере:
$ env | grep '^USER='
Используйте -r, чтобы рекурсивно искать в доступных для чтения файлах каталога:
$ grep -r 'listen_port' config/
Диагностические сообщения вроде ошибок доступа поступают в stderr и не являются входом для сопоставления. Сужайте область поиска и разбирайтесь с правами, а не повышайте доступ без необходимости.
Какие данные ищет grep в generate-report | grep 'failed'?
Интерпретация кода выхода
Для обычного поиска GNU grep возвращает код 0, если выбрана хотя бы одна строка, 1, если не выбрано ни одной, и 2 при ошибке. Поэтому сценарий может проверить совпадение, не приравнивая отсутствие совпадений к нечитаемому файлу или недопустимому шаблону.
Параметры вроде -q подавляют обычный вывод и останавливают поиск после первого совпадения, что удобно для проверок условий. Не делайте вывод об успехе только по пустому экрану: -q, перенаправление, отсутствие совпадения и ошибка могут дать мало или совсем не дать stdout, хотя их коды различаются.
Чтобы попрактиковаться в поиске фиксированных строк и регулярных выражений, выполните лабораторные работы:
- Поиск текста с grep в Linux — потренируйтесь выполнять базовый поиск, выводить номера строк, использовать якоря, базовые и расширенные регулярные выражения.
- Команда grep в Linux: поиск шаблонов — научитесь искать шаблоны в текстовых файлах и описывать сложные совпадения регулярными выражениями.
- Иголка в стоге сена — примените
grepдля поиска шаблонов, подсчёта, извлечения уникальных значений и сочетания нескольких условий в журналах.
Урок завершён
Вы завершили grep
Теперь вы можете искать в построчном тексте и отличать совпадения от ошибок.
Выбирайте базовый, расширенный или фиксированный режим сопоставления.
Заключайте шаблоны в кавычки и используйте
-eпри начальном дефисе.Считайте выбранные строки, не путая их с отдельными вхождениями.
Фильтруйте stdin или рекурсивно ищите в ограниченном каталоге.
Интерпретируйте коды выхода для совпадения, отсутствия совпадения и ошибки.
Сохраните прогресс
Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.
Создать бесплатный аккаунт