grep
Введение
Это статья про 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'
Сколько раз слово использовано в тексте
Начнём с простого примера: слово встречается в строке только один раз.
Например, лог работы сервера содериж строки вида
2024-10-06-02-10-24-ERROR: Something is NOK
Нужно вычислить сколько ошибок зафиксированно в лог файле 2024-10-06-log.txt
grep -o -i ERROR 2024-10-06-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://eth1.ru;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://aviasales.ru;Travel
Booking.com;https://booking.com;Hotels
Hotellook;https://Hotellook.com;Hotels
Велодрайв;https://velodrive.ru;Bicycles
Xiaomi;https://mi-shop.com;Android
Samsung;https://www.samsungstore.ru;Android
Book24;https://Book24.ru;Books
GeekBrains;https://gb.ru;Education
Нетология;https://netology.ru;Education
SkillBox;https://SkillBox.ru;Education
Pluralsight;https://Pluralsight.com;Education
СовКомСтрахование;https://sovcomins.ru;Insurance
Полис 812;https://polis812.ru;Insurance
Vivo;https://ru.vivo.com/;Android
Beget;https://beget.com;Hosting
Reg.ru;https://Reg.ru;Hosting
OLDI;https://oldi.ru;Laptops
Если выполнить поиск по какому-то слову без флагов, например
cat partners.csv | grep Hosting
Получим строки без номеров
Beget;https://beget.com;Hosting Reg.ru;https://Reg.ru;Hosting
Теперь то же самое но с -n
cat partners.csv | grep -n Hosting
22:Beget;https://beget.com;Hosting 23:Reg.ru;https://Reg.ru;Hosting
Слева появились номера строк
grep -m
Флаг -m задает верхний предел по количеству
Если вам нужны не все результаты а только один - используйте
grep -m 1 pattern file
Рассмотрим файл partners.csv со списком сайтов
name;url;area
URN.SU;https://eth1.ru;IT
Booking.com;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://eth1.ru;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://eth1.ru;IT ETH1.RU;https://eth1.ru;IT
Логические операторы
Задача: показать только сегодняшние ERROR и WARNING строки из лога а также те, где
присутствует слово panic
Для этого пригодится условие ИЛИ, которое можно использовать в расширенном режиме.
grep '2024-10-06' topbicycle.log | grep -E 'ERROR|WARNING|*panic*'