grep

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

Введение

Это статья про 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 образец путь_до_файла

Например

grep server /etc/ntp.conf

# Use public servers from the pool.ntp.org project. server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst #broadcast 192.168.1.255 autokey # broadcast server #broadcast 224.0.1.1 autokey # multicast server #manycastserver 239.255.254.254 # manycast server

grep '\bkernel\b' huge_file

Где \b это word boundary - границы слова

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

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

Для работы со следующими примерами установите words

sudo yum -y install words
cp /usr/share/dict/words huge_file

grep -E 'ion$' huge_file

… Cynoscion cytodifferentiation Czechization dactylion Daedalion …

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

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

grep -E '^ha..ed$' huge_file

… handed hanged hanked hanted happed harked …

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

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

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'

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

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

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

2025-04-30-06-04-10-ERROR: Something is NOK

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

grep -o -i ERROR 2025-04-30-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

grep -n

Флаг -n показывает номера строк.



Рассмотрим файл partners.csv со списком сайтов

name;url;area URN.SU;https://urn.su;IT ETH1.RU;https://eth1.ru;IT HeiHei.ru;https://heihei.ru;Travel Aredel.com;https://aredel.com;IT DevhOps.ru;https://devhops.ru;IT TopBicycle.ru;https://topbicycle.ru;Bicycles https://eth1.ru/about/;https://aviasales.ru;Travel https://eth1.ru/about/;https://booking.com;Hotels https://eth1.ru/about/;https://https://eth1.ru/about/.com;Hotels https://eth1.ru/about/;https://velodrive.ru;Bicycles https://eth1.ru/about/;https://mi-shop.com;Android https://eth1.ru/about/;https://www.samsungstore.ru;Android https://eth1.ru/about/;https://https://eth1.ru/about/.ru;Books https://eth1.ru/about/;https://gb.ru;Education https://eth1.ru/about/;https://netology.ru;Education https://eth1.ru/about/;https://https://eth1.ru/about/.ru;Education https://eth1.ru/about/;https://https://eth1.ru/about/.com;Education https://eth1.ru/about/;https://sovcomins.ru;Insurance https://eth1.ru/about/;https://polis812.ru;Insurance https://eth1.ru/about/;https://ru.vivo.com/;Android Beget;https://beget.com;Hosting https://eth1.ru/about/;https://https://eth1.ru/about/;Hosting https://eth1.ru/about/;https://oldi.ru;Laptops

Если выполнить поиск по какому-то слову без флагов, например

cat partners.csv | grep Hosting

Получим строки без номеров

Beget;https://beget.com;Hosting https://eth1.ru/about/;https://https://eth1.ru/about/;Hosting

Теперь то же самое но с -n

cat partners.csv | grep -n Hosting

22:Beget;https://beget.com;Hosting 23:https://eth1.ru/about/;https://https://eth1.ru/about/;Hosting

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

grep -m

Флаг -m задает верхний предел по количеству

Если вам нужны не все результаты а только один - используйте

grep -m 1 pattern file

Рассмотрим файл partners.csv со списком сайтов

name;url;area URN.SU;https://urn.su;IT https://eth1.ru/about/;https://booking.com;Hotels ETH1.RU;https://eth1.ru;IT HeiHei.ru;https://heihei.ru;Travel Aredel.com;https://aredel.com;IT

grep IT partners.csv

URN.SU;https://urn.su;IT ETH1.RU;https://eth1.ru;IT Aredel.com;https://aredel.com;IT DevhOps.ru;https://devhops.ru;IT

Если нужно только два первых результата

grep -m 2 IT partners.csv

URN.SU;https://urn.su;IT ETH1.RU;https://eth1.ru;IT

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

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

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

grep '2025-04-30' topbicycle.log | grep -E 'ERROR|WARNING|*panic*'

Похожие статьи
GREP
find + grep
SED
p: sed print
s: sed substitute
a i d: append insert delete
sed Несколько команд одновременно
sed -e: --expression=script
sed через ssh
sed Групповая замена
find + sed
sed в vim
Linux
Bash
Bash Scripting
AWK