grep

Содержание статьи
Введение
Создать функцию
Основные команды
Все строки где нет определённого слова
Поиск из вывода функции
Поиск из вывода функции по нескольким словам
Частота появления слова в файле
Найти пустые строки
Найти не пустые строки
grep -E: расширенный режим
Логические операторы

Введение

Это статья про grep. Про SED вы можете прочитать в статье «Основы SED» про AWK - в статье «AWK»

Флаг -v позволяет инвертировать результат. То есть найти противополжное тому что искал grep без этого флага

-v, --invert-match
       Invert the sense of matching, to select non-matching lines.

По умолчанию я предполагаю, что Вы работаете в Bash под Windows 10 или в Bash в Linux .

Основные команды grep

Вывести все упоминания слова

Предположим вы запустили CentOS Linux и хотите посмотреть все установленные пакеты в названии которых есть слово kernel

yum list installed | grep kernel

abrt-addon-kerneloops.x86_64 2.1.11-60.el7.centos @base kernel.x86_64 3.10.0-1160.el7 @anaconda kernel.x86_64 3.10.0-1160.2.2.el7 @updates kernel.x86_64 3.10.0-1160.6.1.el7 @updates kernel-devel.x86_64 3.10.0-1160.2.2.el7 @updates kernel-devel.x86_64 3.10.0-1160.6.1.el7 @updates kernel-headers.x86_64 3.10.0-1160.6.1.el7 @updates kernel-tools.x86_64 3.10.0-1160.6.1.el7 @updates kernel-tools-libs.x86_64 3.10.0-1160.6.1.el7 @updates

И наоборот, можно посмотреть все строки где нет слова kernel : нужно добавить опцию -v

yum list installed | grep -v kernel

Если вам нужно найти что-то в файле, можно вместо | воспользоваться выражением

grep '\bkernel\b' huge_file

Где huge_file это имя файла в текущей директории в котором мы ищем отдельные слова kernel.

То есть слова akernel или kernelz найдены не будут

Вывести всё, что начинается со слова

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

yum list installed | grep ^kernel

kernel.x86_64 3.10.0-1160.el7 @anaconda kernel.x86_64 3.10.0-1160.2.2.el7 @updates kernel.x86_64 3.10.0-1160.6.1.el7 @updates kernel-devel.x86_64 3.10.0-1160.2.2.el7 @updates kernel-devel.x86_64 3.10.0-1160.6.1.el7 @updates kernel-headers.x86_64 3.10.0-1160.6.1.el7 @updates kernel-tools.x86_64 3.10.0-1160.6.1.el7 @updates kernel-tools-libs.x86_64 3.10.0-1160.6.1.el7 @updates

Вывести всё, что заканчивается на определённый набор символов

grep -E 'ion$' huge_file

compensation
generation

Найти слова по первым и последним буквам

Допустим вы знаете только начало и конец слова

grep -E '^to..le$' huge_file

topbicycle

Несколько символов подряд

Найти слова с пятью гласными подряд

grep -E '[aeiou]{5}' /usr/share/dict/words

cadiueio Chaouia cooeeing euouae Guauaenok miaoued miaouing Pauiie queueing

Поиск из вывода функции

Нужно сперва вызвать функцию со всеми флагами, затем поставить pipe и сделать grep

Например из файла today.log можно выделить все строки с ошибками

cat today.log | grep ERROR

Поиск из вывода функции по нескольким словам

Например, нужно из top выцепить сразу несколько процессов:

top | grep 'process1\|process2\|process3'

Сколько раз слово использовано в тексте

Начнём с простого примера: слово встречается в строке только один раз.

Например, лог работы сервера содериж строки вида

2021-05-14-04-05-27-ERROR: Something is NOK

Нужно вычислить сколько ошибок зафиксированно в лог файле 2021-05-14-log.txt

grep -o -i ERROR 2021-05-14-log.txt | wc -l

Если вы хотите использовать эту команду в скрипте - рекомендую статью Вывод команды в переменную в bash скрипте

Найти пустые/не пустые строки

Найти все пустые строки в файле ntp.conf

grep '^$' /etc/ntp.conf

Найти все не пустые строки в файле ntp.conf

grep -v '^$' /etc/ntp.conf

grep -E

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

Найти в файле file все foobar или foo bar с ровно одним пробелом

grep -E 'foo\s?bar' file

Найти в файле file все foobar или foo bar с ровно двумя пробелами

grep -E 'foo\s{2}bar' file

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

Номер должен быть в формате 111-11-1111 то есть три цифры дефис две цифры дефис четыре цифры

cat bikes.txt

Stels,Pilot,111-22-3333
Merida,BigNine,,
Stark,Cobra,xxx-xx-xxx
Forward,Tracer,1234-0
Author,Grand,444-55-6666
Stels,Pilot21,111-22-3344
Giant,Lannister,555-66-7777
Helkama,Jopo,,

grep -vE '\b[0-9]{3}-[0-9]{2}-[0-9]{4}\b' bikes.txt

Merida,BigNine,,
Stark,Cobra,xxx-xx-xxx
Forward,Tracer,1234-0
Helkama,Jopo,,

Правильные записи

grep -E '\b[0-9]{3}-[0-9]{2}-[0-9]{4}\b' bikes.txt

Stels,Pilot,111-22-3333
Author,Grand,444-55-6666
Stels,Pilot21,111-22-3344
Giant,Lannister,555-66-7777

Логические операторы

Задача: показать только сегодняшние ERROR и WARNING строки из лога а также те, где присутствует слово panic

Для этого пригодится условие ИЛИ, которое можно использовать в расширенном режиме.

grep '2021-05-14' topbicycle.log | grep -E 'ERROR|WARNING|*panic*'

Поиск по сайту

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящуюю по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: