Утилита grep. Поиск строк, соответствующих заданному шаблону.

Описание.

Команда grep (от англ. global regular expression print) используется для поиска строк, соответствующих заданному шаблону (в том числе регулярным выражениям), внутри одного или нескольких файлов. Результат выводится на экран, в файл или передаётся другой команде через пайп (|).

Синтаксис.

Синтаксис grep заключается в следующем:

grep [опции] "шаблон" file.txt [file...]

или

$ команда | grep [опции] "шаблон"

где:

  • options — Флаги или параметры, которые изменяют поведение grep команды (например, чувствительность к регистру, номера строк и так далее).
  • pattern — Поисковый термин или регулярное выражение, которое вы хотите найти.
  • file — Файл или файлы, в которых вы хотите выполнить поиск.

Основные опции.

Опции можно комбинировать с друг другом.

  • -i — игнорировать регистр.
  • -r, --recursive рекурсивный поиск в подкаталогах.
  • -n — показывать номера строк.
  • -l — выводить только имена файлов с совпадениями.
  • -v — инвертировать результат (вывести строки, которые не совпадают).
  • -c — подсчитать количество совпадающих строк.
  • -h — не показывать имя файла перед совпадением.
  • -s — тихий режим (ничего не выводит, только код возврата).
  • -E — использовать расширенные регулярные выражения.
  • -F — искать точное совпадение как фиксированную строку (не использовать регулярные выражения).

Пример текста.

$ mcedit ~/test/somefile.txt
Real-Life News Article Example:
Let’s take The New York Times as an example.
They produce news articles on a wide array of topics, from international events to local incidents. 
An example could be a report on the recent United Nations Climate Change Conference. 
The article would delve into the key points of the conference, list the participating countries, detail the agreements made, and provide interpretations from various experts.
These reports allow readers to stay informed about global events and developments.
EXAMPLE text for bash script.
$ mcedit ~/test/otherfile.txt
Real-Life Dictionary Example:
If we take the Oxford English Dictionary as an example, it is one of the most well-known and respected dictionaries worldwide.
Its latest edition houses definitions for over 600,000 words, providing not just their meanings, but their pronunciation guides and etymology as well. 
The Oxford English Dictionary is a vital resource for linguists, writers, researchers, and anyone interested in the nuances of the English language.
EXAMPLE text for bash script.
mcedit ~/test/emailfile.txt
Пример корректного email: user@example.com
Еще один пример: john.doe123@sub.domain.org
Некорректный email: user@.com
Еще один некорректный пример: @example.com
Корректный email с точками и дефисами: user.name+alias@sub-domain.example.com
Email с верхним регистром: USER@DOMAIN.COM
Некорректный email без домена: user@com
Еще один корректный пример: email@123.123.123.123
Некорректный email с пробелом: user @example.com
Еще один некорректный пример: user@domain..com
Корректный email: user.name@example.co.uk
Некорректный email: user@domain.c
Корректный email: user+alias@domain.com
Некорректный email: user@domain.-com

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

1. Найдёт и выведет все строки в файле somefile.txt, содержащие слово example.

$ grep "example" ~/test/somefile.txt

Ответ:

2. Подсветить совпадения цветом -color[=КОГДА].

  • --colour[=КОГДА] — использовать маркеры для различия совпадающих строк; КОГДА может быть «always» (всегда), «never» (никогда) или «auto» (автоматически)

Например:

$ grep --color=never "example" ~/test/somefile.txt

Ответ: (текст без цветных букв в выведенном тексте)

3. Ищет example во всех *.txt файлах в определенном месте.

$ grep "example" ~/test/*.txt

Ответ:

4. Вывести только имена файлов с совпадениями по example.

$ grep -l "example" ~/test/*.txt

Ответ:

5. Найдет слово example как отдельное слово.

$ grep -w "example" ~/test/somefile.txt

Ответ:

6. Выведет строки, где есть совпадение и United, и Conference.

$ grep "United.*Conference" ~/test/somefile.txt
$ grep "begin.*end" ~/test/somefile.txt

Ответ:

7. Показать только совпавшую часть строки.

$ grep -o "United.*Conference" ~/test/somefile.txt
$ grep -o "begin.*end" ~/test/somefile.txt

Ответ:

8. Показать строки, полностью совпадающие с шаблоном.

Поищем без оригинальной точки в конце предложения.

$ grep -x "EXAMPLE text for bash script" ~/test/somefile.txt

Поищем с оригинальной точкой в конце предложения.

$ grep -x "EXAMPLE text for bash script." ~/test/somefile.txt

Ответ: (как видно, без точки он ничего не нашел, нет точного совпадения строки)

9. Выведет строки, содержащие New York и Oxford.

$ grep -e "New York" -e "Oxford" ~/test/*.txt

Ответ:

10. Ищет строку example в файле somefile.txt, игнорируя регистр. Ищет example, Example, EXAMPLE и так далее, по аналогии.

$ grep -i "example" ~/test/somefile.txt

Ответ:

11. Ключ -m2 ограничивает вывод example только 2 совпадениями.

 $ grep -m2 "example" ~/test/somefile.txt

Ответ:

12. Показать 2 строки до и после совпадения.

$ grep -A2 -B2 "United Nations Climate Change Conference" ~/test/somefile.txt

Ответ:

13. Показать 2 строки контекста вокруг совпадения.

$ grep -C2 "600,000" ~/test/otherfile.txt

Ответ:

14. Посчитает количество совпадений, сколько раз встречается слово example в файле, то есть количество строк со словом example в файле somefile.txt.

$ grep -c "example" ~/test/somefile.txt

Ответ:

Можно комбинировать с игнорированием регистра -i.

$ grep -c -i "example" ~/test/somefile.txt

Ответ:

15. Рекурсивный поиск в указанном каталоге. Ищет example рекурсивно, во всех файлах указанного каталога ~ и его подкаталогов.

$ grep -r "example" ~/test/
$ grep -r -i "example" ~/test/

Ответ:

16. Показывает только совпадающие строки example, без контекста. Выведет только совпадающие строки с example, без указания имён файлов.

$ grep -h "example" ~/test/*.txt

Ответ:

17. Показывает номера строк вместе с совпадениями. Покажет строку и её номер в файле.

$ grep -n "example" ~/test/somefile.txt
$ grep -n -i "example" ~/test/*.txt

Ответ:

18. Инвертировать результат, то есть вывести строки, НЕ содержащие шаблон.

Выведет все строки, где нет слова example. Учет регистров тоже работает.

$ grep -v "example" ~/test/somefile.txt
$ grep -v -i "example" ~/test/somefile.txt

Ответ:


19. Выведет строки, не содержащие «New York» и «Oxford«.

$ grep -v -e "New York" -e "Oxford" ~/test/*.txt

Ответ:

20. Искать строки, начинающиеся с example или «Real-Life«.

$ grep "^example" ~/test/*.txt
$ grep "^Real-Life" ~/test/*.txt

Ответ:

21. Найти строки, оканчивающиеся на «:» двоеточие или на определенное выражение.

$ grep ":$" ~/test/somefile.txt

Ответ:

22. Показывает строки, содержащие цифры 1, 2, 3, 4, 5, 6, 7, 8, 9, 0.

$ grep "[0-9]" ~/test/otherfile.txt

Ответ:

23. Найти строку argument в бинарном файле /usr/bin/find.

$ grep -a "argument" /usr/bin/find

Ответ:

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

Ключ -E включает поддержку расширенных регулярных выражений.

1. Найти строки, начинающиеся с определённого слова EXAMPLE:

# grep -E "^EXAMPLE" ~/test/*.txt

Ответ:

2. Найти строки, оканчивающиеся на «:» двоеточие или на определенное выражение:

# grep -E ":$" ~/test/*.txt

Ответ:

3. Найти строки с цифрами 1, 2, 3, 4, 5, 6, 7, 8, 9, 0:

# grep -E "[0-9]" ~/test/*.txt

Ответ:

4. Найти строки с email-адресами:

# grep -E "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" ~/test/emailfile.txt

Ответ:

5. Найти выражения New York или Oxford:

# grep -E "New York|Oxford" ~/test/*.txt

Ответ:

6. Найти строки, которые начинаются с больших букв английского алфавита:

# grep -E "^[a-zA-Z]" ~/test/*.txt

Ответ:

7. Вывести файл без закомментированных строк:

#  grep -vE (^[[:space:]]*([#;!].*)?$) /etc/zabbix/zabbix_agentd.conf

Ответ:

Как исключить слова и шаблоны.

Параметр -w указывает grep возвращать только те строки, в которых указанная строка представляет собой целое слово (заключенное в символы, не содержащие слов).

По умолчанию grep чувствителен к регистру. Это означает, что символы верхнего и нижнего регистра обрабатываются как отдельные. Чтобы игнорировать регистр при поиске, вызовите grep с параметром -i.

Чтобы отображались только те строки, которые не соответствуют шаблону поиска, используйте параметр -v (или --invert-match).

Например, чтобы вывести строки, не содержащие строку no login, используйте следующую команду:

$ sudo grep -wv nologin /etc/passwd

Ответ:

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

Чтобы указать два или более шаблона поиска, используйте опцию -e:

$ sudo grep -wv -e nologin -e bash /etc/passwd

Вы можете использовать параметр -e столько раз, сколько вам нужно.

Другой способ исключить несколько шаблонов поиска — объединить шаблоны с помощью OR оператор |.

В следующем примере выводятся строки, которые не содержат строк nologin или bash:

$ sudo grep -wv 'nologin\|bash' /etc/passwd

Утилита grep поддерживает три синтаксиса регулярных выражений: базовый, расширенный и совместимый с Perl. По умолчанию grep интерпретирует шаблон как базовое регулярное выражение, в котором метасимволы, такие как |, теряют свое особое значение, и вы должны использовать их версии с обратной косой чертой.

Если вы используете расширенное регулярное выражение -E, то оператор | не должен экранироваться, как показано ниже:

$ sudo grep -Ewv 'nologin|bash' /etc/passwd

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

$ sudo grep -v "^games" file.txt

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

Например, чтобы распечатать все запущенные процессы в вашей системе, за исключением тех, которые выполняются от имени пользователя root, вы можете отфильтровать вывод команды ps:

$ sudo ps -ef | grep -wv root

Как исключить каталоги и файлы.

Иногда при выполнении рекурсивного поиска с параметрами -r или -R может потребоваться исключить определенные каталоги из результатов поиска.

Основное различие между параметрами -r или -R заключается в том, что при вызове grep с использованием прописной буквы «R» он будет следовать по всем символическим ссылкам.

Чтобы исключить каталог из поиска, используйте параметр --exclude-dir. Путь к исключенному каталогу указан относительно каталога поиска.

Ниже приведен пример, показывающий, как искать строку linuxize во всех файлах внутри /etc, за исключением каталога /etc/pki:

$ sudo grep -R --exclude-dir=pki linuxize /etc

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

Например, чтобы найти файлы, содержащие строку gnu в вашей системе GNU\Linux, за исключением каталогов proc, boot и sys, вы должны запустить:

$ sudo grep -r --exclude-dir={proc,boot,sys} gnu /

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

В приведенном ниже примере мы ищем строку linuxize во всех файлах в текущем рабочем каталоге, исключая файлы, оканчивающиеся на .png и .jpg каталоги:

$ sudo grep -rl --exclude=*.{png,jpg} linuxize *

Полезные заметки.

1. Команды утилите grep чувствительны к регистру по умолчанию.

2. Используйте --color=auto для цветовой подсветки совпадений example:

$ grep --color=auto "example" ~/test/*.txt

Ответ:

3. Для работы с большими файлами можно комбинировать с less:

$ grep "example" ~/test/somefile.txt | less

Ответ: (крутим вверх-вниз и смотри результаты выборки)

Пример работы скрипта.

Создадим тестовый файл тест.txt:

$ echo -e "Это тестовая строка\nОшибка найдена\nТест прошёл успешно" > тест.txt

Найдём строки со словом ошибка:

$ grep -i "ошибка" тест.txt

Ответ:

Возвращаемые значения.

Это полезно при использовании grep в скриптах и проверке условий.

0 — найдено хотя бы одно совпадение.
1 — совпадений нет.
2 — ошибка выполнения.

Альтернативы и дополнения.

  • egrep — то же, что grep -E — работает с расширенными регулярными выражениями.
  • fgrep — быстрый поиск фиксированных строк (эквивалент grep -F).
  • rg (ripgrep) — современная альтернатива с высокой скоростью поиска.
  • awk / sed — для сложной обработки текста.
  • find + grep — для поиска файлов и анализа их содержимого.

Оригиналы источников информации.

  1. gubin.systems «Команда grep.»
  2. youstable.com «Как использовать команду grep в Linux для эффективного поиска.»
  3. cloud.ru «Команда grep в Linux: как искать строки и шаблоны.»
  4. timeweb.cloud «Использование Grep и регулярных выражений для поиска текстовых шаблонов в Linux.»
  5. helpfulprofessor.com «Informational Texts Examples.»
  6. linuxize.com «How to Exclude in Grep.»
image_printСКАЧАТЬ ВЕРСИЮ ДЛЯ ПЕЧАТИ

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *