Найти в Дзене

Команды grep, egrep и аналоги в терминалах Linux, Windows и MacOS

Оглавление

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

Они используются для фильтрации строк с использованием регулярных выражений.

В зависимости от операционной системы и терминала, могут существовать небольшие различия в их реализации.

Не путайте их с командой find, которая используется для поиска файлов. Подробнее о ней прочитайте в статье "Команда find и аналоги в терминалах Linux, Windows и MacOS".

Давайте рассмотрим использование этих команд в разных окружениях и терминалах.

1. Linux Terminal

grep:

grep (Global Regular Expression Print) — это команда для поиска строк, которые соответствуют заданному регулярному выражению. Она поддерживает базовые регулярные выражения (BRE).

Пример:

grep 'hello' file.txt

Этот запрос выведет все строки из file.txt, содержащие слово "hello".

egrep:

egrep — это расширенная версия grep, которая поддерживает расширенные регулярные выражения (ERE). Однако в современных системах egrep считается устаревшим, и его функционал включен в grep -E.

Пример:

egrep 'hello|world' file.txt
# или эквивалент с grep -E
grep -E 'hello|world' file.txt

Этот запрос выведет строки, которые содержат либо "hello", либо "world".

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

1. Простой поиск строки в файле

Самый базовый случай — это поиск конкретной строки в файле.

grep 'hello' file.txt

Этот запрос выведет все строки в файле file.txt, которые содержат слово "hello".

2. Поиск с игнорированием регистра

Если необходимо найти строку, игнорируя регистр символов, используйте флаг

-i:

grep -i 'hello' file.txt

Этот запрос найдёт строки, содержащие "hello", "Hello", "HELLO" и т.д.

3. Поиск строк, которые не содержат шаблон

Чтобы вывести строки, которые не содержат искомый шаблон, используйте флаг -v:

grep -v 'hello' file.txt

Этот запрос выведет все строки, которые не содержат слово "hello".

4. Поиск с выводом номеров строк

Для того, чтобы в выводе отображались номера строк, используйте флаг -n:

grep -n 'hello' file.txt

Например, вывод будет таким:

3:hello world
7:Hello there

5. Рекурсивный поиск по каталогам

Для поиска во всех файлах в указанной директории и её подкаталогах, используйте флаг -r:

grep -r 'hello' /path/to/directory

Этот запрос рекурсивно обойдёт все файлы в указанной директории и выведет строки, содержащие "hello".

6. Поиск с указанием имени файла

Если вы хотите, чтобы в выводе было указано имя файла, где содержится строка с искомым шаблоном, используйте флаг -H (по умолчанию в рекурсивном поиске):

grep -H 'hello' file.txt

Вывод может быть следующим:

file.txt:hello world

7. Поиск по нескольким файлам

Вы можете указать несколько файлов для поиска:

grep 'hello' file1.txt file2.txt

Этот запрос выведет строки, содержащие "hello", из обоих файлов.

8. Поиск с подсветкой найденного текста

Для того, чтобы выделить найденный текст цветом, используйте флаг --color:

grep --color 'hello' file.txt

Этот флаг выделит найденные совпадения цветом, что упрощает их визуальное обнаружение.

9. Поиск по регулярным выражениям

grep поддерживает базовые регулярные выражения. Например, чтобы найти строки, начинающиеся с "hello":

grep '^hello' file.txt

Этот запрос найдёт только строки, которые начинаются с "hello".

10. Поиск с использованием расширенных регулярных выражений

Для использования расширенных регулярных выражений (например, с группировкой и альтернативами), используйте флаг -E:

grep -E 'hello|world' file.txt

Этот запрос выведет строки, содержащие либо "hello", либо "world". Это эквивалент команды egrep.

11. Вывод только совпадающих частей строки

Если вам нужно вывести только ту часть строки, которая соответствует шаблону, используйте флаг -o:

Этот запрос выведет только совпадающие части строк, а не всю строку целиком.

12. Каналы и перенаправления

Вы можете использовать grep с другими командами через каналы для фильтрации вывода:

ps aux | grep 'firefox'

Этот запрос отфильтрует вывод команды ps aux и выведет только строки, содержащие "firefox".

13. Поиск с ограничением по количеству результатов

Если вам нужно вывести только определённое количество совпадений, используйте флаг -m:

grep -m 2 'hello' file.txt

Этот запрос выведет только первые два совпадения.

14. Поиск в сжатых файлах

Если вам нужно искать строки в сжатых файлах (например, gzip), используйте команду zgrep:

zgrep 'hello' file.txt.gz

Это аналог команды grep для сжатых файлов.

15. Вывод строк, следующих за найденной строкой

Для вывода строк, следующих за найденной строкой, используйте флаг -A (after):

grep -A 2 'hello' file.txt

Этот запрос выведет строки, содержащие "hello", и две строки после каждой найденной.

16. Вывод строк, предшествующих найденной строке

Для вывода строк, предшествующих найденной строке, используйте флаг -B (before):

grep -B 2 'hello' file.txt

Этот запрос выведет строки, содержащие "hello", и две строки до каждой найденной.

17. Вывод строк до и после найденной строки

Если вы хотите вывести несколько строк до и после найденной строки, используйте флаг -C (context):

grep -C 2 'hello' file.txt

Этот запрос выведет строки, содержащие "hello", а также по две строки до и после каждой найденной.

18. Поиск по шаблону в бинарных файлах

По умолчанию grep не ищет строки в бинарных файлах. Если нужно игнорировать предупреждения о бинарных файлах и искать в них, используйте флаг -a:

grep -a 'hello' binaryfile

19. Только имя файла с совпадением

Если вам нужно вывести только имена файлов, которые содержат хотя бы одно совпадение, используйте флаг -l:

grep -l 'hello' *.txt

Этот запрос выведет имена всех файлов с расширением .txt, содержащих "hello".

20. Подсчёт количества совпадений

Для того, чтобы вывести количество строк, которые содержат совпадение, используйте флаг -c:

grep -c 'hello' file.txt

тот запрос выведет количество строк, содержащих "hello", в файле file.txt.

21. Инвертирование вывода (с -L)

Для того, чтобы вывести только имена файлов, которые не содержат совпадения, используйте флаг -L:

grep -L 'hello' *.txt

Этот запрос выведет имена всех файлов, которые не содержат "hello".

22. Поиск только целых слов

Для поиска только целых слов (а не подстрок), используйте флаг -w:

grep -w 'hello' file.txt

Этот запрос найдёт только те строки, где "hello" является целым словом, а не частью другого слова, например, "hello123" не будет найдено.

23. Поиск строки в нескольких форматах файлов

Вы можете искать сразу в нескольких типах файлов с использованием подстановочных символов:

grep 'hello' *.txt *.log

Этот запрос ищет "hello" в файлах с расширением .txt и .log.

24. Поиск строк с определённой длиной

Если нужно найти строки определённой длины, используйте регулярные выражения. Например, строки длиной 5 символов:

grep '^.{5}$' file.txt

Этот запрос найдёт строки, состоящие ровно из 5 символов.

2. MacOS Terminal

На MacOS команды grep и egrep работают практически так же, как в Linux, поскольку MacOS основана на Unix.

Пример использования:

grep 'apple' file.txt
egrep 'apple|orange' file.txt

В MacOS также можно использовать grep -E как замену устаревшему egrep.

3. Git Bash (Windows)

Git Bash — это эмулятор Bash для Windows, который предоставляет пользователям возможность использовать команды Unix. В Git Bash команды grep и egrep работают так же, как в Linux и MacOS.

Пример:

grep 'commit' somefile.txt
egrep 'commit|pull' somefile.txt

Аналогично, grep -E может заменить egrep.

4. Windows CMD (Командная строка)

Классическая командная строка Windows (cmd.exe) не имеет встроенной поддержки команд grep и egrep. Однако можно установить дополнительные утилиты, такие как GnuWin32 (портирование GNU-инструментов для Windows) или использовать сторонние инструменты, такие как Git Bash или Cygwin.

Если grep установлен (например, через GnuWin32), можно использовать его аналогично:

grep "hello" file.txt

Windows CMD также поддерживает альтернативные команды, такие как findstr, которая выполняет похожие функции:

findstr "hello" file.txt

Основные опции findstr:

  • /I — игнорирование регистра:
findstr /I "hello" file.txt
  • /R — использование регулярных выражений:
findstr /R "hello.*world" file.txt

5. PowerShell

PowerShell использует собственные команды для поиска текста, такие как

Select-String

, которая выполняет функции, аналогичные grep.

Пример:

Select-String -Pattern 'hello' -Path file.txt

Этот запрос выведет строки из file.txt, содержащие "hello".

Основные параметры:

  • -Pattern — шаблон для поиска.
  • -Path — путь к файлу.
  • -CaseSensitive — поиск с учётом регистра:
Select-String -Pattern 'hello' -Path file.txt -CaseSensitive
  • -NotMatch — инвертированный поиск (аналог -v у grep):
Select-String -Pattern 'hello' -Path file.txt -NotMatch

Для работы с регулярными выражениями PowerShell также поддерживает синтаксис:

Select-String -Pattern 'hello|world' -Path file.txt

Основные различия между терминалами:

1. Linux и MacOS:Полноценная поддержка grep и egrep.
Для расширенных регулярных выражений лучше использовать grep -E вместо устаревшего egrep.

2. Git Bash:Полностью поддерживает команды grep и egrep, как в Unix-системах.

3. Windows CMD:Нет встроенной поддержки grep. Альтернативой может быть установка сторонних утилит или использование команды findstr.

4. PowerShell:Использует команду Select-String вместо grep, которая поддерживает аналогичные параметры с более удобной интеграцией в среду Windows.

Заключение

Команды grep и egrep используются для поиска по тексту с помощью регулярных выражений в Unix-подобных системах (Linux, MacOS, Git Bash). В Windows их можно использовать через эмуляторы или устанавливать сторонние утилиты. В PowerShell для этих целей предназначена команда Select-String.

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

Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?

Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика

Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.

Обязательно прочитайте: Что должен знать и уметь тестировщик

Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам