Утилита 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— для поиска файлов и анализа их содержимого.
Оригиналы источников информации.
- gubin.systems «Команда grep.»
- youstable.com «Как использовать команду grep в Linux для эффективного поиска.»
- cloud.ru «Команда grep в Linux: как искать строки и шаблоны.»
- timeweb.cloud «Использование Grep и регулярных выражений для поиска текстовых шаблонов в Linux.»
- helpfulprofessor.com «Informational Texts Examples.»
- linuxize.com «How to Exclude in Grep.»

