grep
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