grep
100%

Text-Fu · Урок 16

grep

Научитесь выбирать строки по фиксированным строкам или регулярным выражениям и интерпретировать результаты grep.

Команда grep выбирает входные строки, совпадающие с шаблоном. Она умеет искать в именованных файлах или stdin, выводить контекст совпадений, считать выбранные строки и сообщать через код выхода, найдено ли совпадение.

Поиск совпадающих строк в файле

Передайте шаблон, а затем один или несколько входных файлов:

$ 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, хотя их коды различаются.

Чтобы попрактиковаться в поиске фиксированных строк и регулярных выражений, выполните лабораторные работы:

  1. Поиск текста с grep в Linux — потренируйтесь выполнять базовый поиск, выводить номера строк, использовать якоря, базовые и расширенные регулярные выражения.
  2. Команда grep в Linux: поиск шаблонов — научитесь искать шаблоны в текстовых файлах и описывать сложные совпадения регулярными выражениями.
  3. Иголка в стоге сена — примените grep для поиска шаблонов, подсчёта, извлечения уникальных значений и сочетания нескольких условий в журналах.

Урок завершён

Вы завершили grep

Теперь вы можете искать в построчном тексте и отличать совпадения от ошибок.

  • Выбирайте базовый, расширенный или фиксированный режим сопоставления.

  • Заключайте шаблоны в кавычки и используйте -e при начальном дефисе.

  • Считайте выбранные строки, не путая их с отдельными вхождениями.

  • Фильтруйте stdin или рекурсивно ищите в ограниченном каталоге.

  • Интерпретируйте коды выхода для совпадения, отсутствия совпадения и ошибки.

Сохраните прогресс

Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.

Создать бесплатный аккаунт
Назад к Text-Fu