grep

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

Introduction

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

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

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

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

2024-10-05-06-10-53-ERROR: Something is NOK

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

grep -o -i ERROR 2024-10-05-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

Share in social media: