grep

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

Введение

Это статья про 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'

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

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

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

2022-01-18-04-01-32-ERROR: Something is NOK

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

grep -o -i ERROR 2022-01-18-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://aviasales.ru;Travel ;https://booking.com;Hotels ;https://.com;Hotels ;https://velodrive.ru;Bicycles ;https://mi-shop.com;Android ;https://www.samsungstore.ru;Android ;https://.ru;Books ;https://gb.ru;Education ;https://netology.ru;Education ;https://.ru;Education ;https://.com;Education ;https://sovcomins.ru;Insurance ;https://polis812.ru;Insurance ;https://ru.vivo.com/;Android Beget;https://beget.com;Hosting ;https://;Hosting ;https://oldi.ru;Laptops

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

cat partners.csv | grep Hosting

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

Beget;https://beget.com;Hosting ;https://;Hosting

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

cat partners.csv | grep -n Hosting

22:Beget;https://beget.com;Hosting 23:;https://;Hosting

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

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

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

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

grep '2022-01-18' 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

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

Telegram канал чтобы следить за выходом новых статей

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

IT

Актуально сейчас

Разное

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

Telegram канал чтобы следить за выходом новых статей

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

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