
Grep (аббревиатура от «Global Regular Expression Print») — одна из наиболее часто используемых команд в Linux.
grep — это утилита командной строки, которая ищет определённую текстовую строку в одном или нескольких файлах. Она ищет шаблон в каждой строке файла и выводит строки, соответствующие ему. Это мощный инструмент для быстрого и эффективного поиска и анализа больших объёмов текстовых данных. Эту команду можно использовать для поиска определённых слов, фраз или регулярных выражений в файлах любого размера, от небольших текстовых файлов до больших файлов журналов. Если файлы не указаны, grep считывает данные из стандартного потока ввода, который обычно является выводом другой команды.
В этой статье будет показано, как использовать команду grep с практическими примерами и подробными объяснениями наиболее распространенных параметров GNU grep .
Синтаксис команды grep
Синтаксис команды grep следующий:
grep [ OPTIONS ] PATTERN [ FILE... ]
Элементы в квадратных скобках являются необязательными.
-
OPTIONS— ноль или более опций. Grep включает ряд опций , управляющих его поведением. -
PATTERN— Шаблон поиска. -
FILE— Ноль или более имен входных файлов.
Чтобы иметь возможность выполнить поиск в файле, пользователь, запускающий команду, должен иметь права на чтение файла.
Поиск строки в файлах
Наиболее простым применением команды grep является поиск строки (текста) в файле.
Например, чтобы найти все строки, содержащие строку «bash» в файле /etc/passwd , выполните следующую команду:
grep bash /etc/passwd
Вывод будет выглядеть примерно так:
root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
Если строка содержит пробелы, ее необходимо заключить в одинарные или двойные кавычки:
grep "Gnome Display Manager" /etc/passwd
Инвертировать совпадение (исключить)
Используйте опцию -v (или --invert-match ) для отображения строк, не соответствующих шаблону.
Например, чтобы вывести строки, не содержащие строку «nologin», можно использовать:
grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
Использование Grep для фильтрации вывода команды
Вывод команды можно отфильтровать с помощью grep через конвейер, и на терминал будут выведены только строки, соответствующие заданному шаблону. Это значительно упрощает поиск нужной информации в большом объёме вывода.
Например, чтобы узнать, какие процессы запущены в вашей системе от имени пользователя www-data вы можете использовать следующую команду ps :
ps -ef | grep www-data
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
Вы также можете объединить несколько каналов в цепочку по команде. Как видно из вышеприведённого вывода, есть также строка, содержащая процесс grep . Если вы хотите исключить эту строку из вывода, вы можете передать её другому экземпляру grep , как показано ниже:
ps -ef | grep www-data | grep -v grep
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
Рекурсивный поиск
Для рекурсивного поиска по шаблону вызовите grep с опцией -r (или --recursive ). При использовании этой опции grep будет выполнять поиск по всем файлам в указанном каталоге, включая его подкаталоги, пропуская рекурсивно встречающиеся символические ссылки. Это позволяет легко выполнять поиск по всей структуре каталогов, чтобы найти именно то, что вам нужно.
Чтобы следовать всем символическим ссылкам вместо -r , используйте опцию -R (или --dereference-recursive ).
Вот пример, показывающий, как искать строку linuxgazette.ru во всех файлах внутри каталога /etc :
grep -r linuxgazette.ru /etc
Вывод будет включать соответствующие строки, предваряемые полным путем к файлу:
/etc/hosts:127.0.0.1 node2.linuxgazette.ru /etc/nginx/sites-available/linuxgazette.ru: server_name linuxgazette.ru www.linuxgazette.ru;
Если вы используете опцию -R , grep будет следовать всем символическим ссылкам:
grep -R linuxgazette.ru /etc
Обратите внимание на последнюю строку вывода ниже. Эта строка не выводится при вызове grep с -r , поскольку файлы в каталоге sites-enabled Nginx являются символическими ссылками на файлы конфигурации в каталоге sites-available .
/etc/hosts:127.0.0.1 node2.linuxgazette.ru /etc/nginx/sites-available/linuxgazette.ru: server_name linuxgazette.ru www.linuxgazette.ru; /etc/nginx/sites-enabled/linuxgazette.ru: server_name linuxgazette.ru www.linuxgazette.ru;
Показывать только имя файла
Чтобы подавить вывод grep по умолчанию и вывести только имена файлов, содержащих совпадающий шаблон, используйте опцию -l (или --files-with-matches ).
Следующая команда выполнит поиск всех файлов, заканчивающихся на .conf в текущем рабочем каталоге и отобразит только имена файлов, содержащих строку linuxgazette.ru :
grep -l linuxgazette.ru *.conf
Вывод будет выглядеть примерно так:
tmux.conf haproxy.conf
Флаг -l обычно используется вместе с рекурсивной опцией -R :
grep -Rl linuxgazette.ru /tmp
Поиск без учета регистра
По умолчанию grep учитывает регистр, то есть заглавные и строчные символы воспринимаются как отдельные. Например, поиск по запросу «linux» не даст результатов по запросу «Linux».
Чтобы игнорировать регистр при поиске, вызовите grep с опцией -i (или --ignore-case ).
Например, при поиске слова Zebra без каких-либо опций следующая команда не покажет никаких результатов, т.е. будут совпадающие строки:
grep Zebra /usr/share/words
Но если выполнить поиск без учета регистра с помощью опции -i , будут найдены как заглавные, так и строчные буквы:
grep -i Zebra /usr/share/words
В приведенной выше команде «Zebra» будет соответствовать «zebra», «ZEbrA» или любой другой комбинации заглавных и строчных букв в этой строке.
zebra zebra's zebras
Поиск полных слов
При поиске строки grep отобразит все строки, где строка встроена в более крупные строки.
Например, если вы ищете строку «gnu», grep найдет все строки, содержащие «gnu» как отдельную строку или как часть более крупного слова, например «cygnus» или «magnum».
grep gnu /usr/share/words
cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut
Чтобы вернуть только те строки, в которых указанная строка представляет собой целое слово (заключенное в символы, не являющиеся словами), используйте параметр -w (или --word-regexp ).
Символы, входящие в слово, включают в себя буквенно-цифровые символы ( az , AZ и 0-9 ) и символы подчёркивания ( _ ). Все остальные символы считаются несловарными символами.
Если запустить команду с опцией -w , команда grep вернет только те строки, где gnu включено как отдельное слово.
grep -w gnu /usr/share/words
gnu
Показать номера строк
Параметр -n (или --line-number ) указывает grep отображать номера всех строк, соответствующих заданному шаблону. При использовании этого параметра grep выводит совпавшие строки в стандартный поток вывода с соответствующими им номерами строк в качестве префикса.
Например, чтобы отобразить строки из файла /etc/services содержащие строку bash с префиксом соответствующего номера строки, можно использовать следующую команду:
grep -n 10000 /etc/services
Вывод ниже показывает, что совпадения найдены в строках 10423 и 10424.
10423:ndmp 10000/tcp 10424:ndmp 10000/udp
Количество совпадений
Чтобы вывести количество совпадающих строк на стандартный вывод, используйте опцию -c (или --count ).
В примере ниже мы подсчитываем количество учетных записей, в которых в качестве оболочки используется /usr/bin/zsh .
regular expressiongrep -c '/usr/bin/zsh' /etc/passwd
4
Тихий режим
Параметр -q (или --quiet ) указывает grep работать в тихом режиме и не выводить ничего в стандартный вывод. При обнаружении совпадения команда завершается со статусом 0 . Это полезно при использовании grep в скриптах оболочки, когда нужно проверить, содержит ли файл строку, и выполнить определённое действие в зависимости от результата.
Вот пример использования grep в тихом режиме в качестве тестовой команды в операторе if :
if grep -q PATTERN filename then echo pattern found else echo pattern not found fi
Базовое регулярное выражение
GNU Grep имеет три набора функций регулярных выражений : базовый, расширенный и совместимый с Perl.
По умолчанию grep интерпретирует шаблон как базовое регулярное выражение, в котором все символы, за исключением метасимволов, фактически являются регулярными выражениями, которые соответствуют сами себе.
Ниже приведен список наиболее часто используемых метасимволов:
-
Используйте символ
^(крышка) для сопоставления с выражением в начале строки. В следующем примере строкаkangarooбудет соответствовать выражению только в том случае, если она находится в начале строки.grep "^kangaroo" file.txt -
Используйте символ
$(доллар) для сопоставления выражения в конце строки. В следующем примере строкаkangarooбудет соответствовать выражению только в том случае, если она находится в конце строки.grep "kangaroo$" file.txt -
Используйте символ
.(точка) для сопоставления любого отдельного символа. Например, чтобы найти любой текст, начинающийся сkan, состоящий из двух символов и заканчивающийся строкойroo, можно использовать следующий шаблон:grep "kan..roo" file.txt -
Используйте скобки
[ ]для поиска любого отдельного символа, заключённого в скобки. Например, чтобы найти строки, содержащиеacceptили «accent, можно использовать следующий шаблон:grep "acce[np]t" file.txt -
Используйте
[^ ]для сопоставления любого отдельного символа, не заключенного в скобки. Следующий шаблон будет соответствовать любой комбинации строк, содержащихco(any_letter_except_l)a, например,coca,cobaltи так далее, но не будет соответствовать строкам, содержащимcola,grep "co[^l]a" file.txt
Чтобы экранировать особое значение следующего символа, используйте символ (обратная косая черта).
Расширенные регулярные выражения
Чтобы интерпретировать шаблон как расширенное регулярное выражение, используйте опцию -E (или --extended-regexp ). Расширенные регулярные выражения включают все основные метасимволы, а также дополнительные метасимволы для создания более сложных и эффективных шаблонов поиска. Ниже приведены несколько примеров:
-
Сопоставьте и извлеките все адреса электронной почты из указанного файла:
grep -E -o "b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,6}b" file.txt -
Сопоставьте и извлеките все допустимые IP-адреса из указанного файла:
grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt
Опция -o используется для печати только совпадающей строки.
Поиск нескольких строк (шаблонов)
Два или более шаблонов поиска можно объединить с помощью оператора ИЛИ | .
По умолчанию grep интерпретирует шаблон как базовое регулярное выражение, в котором метасимволы, такие как | теряют свое специальное значение, и необходимо использовать их версии с обратной косой чертой.
В примере ниже мы ищем все вхождения слов fatal , error и critical в файле ошибок журнала Nginx :
grep 'fatal|error|critical' /var/log/nginx/error.log
Если вы используете расширенную опцию регулярного выражения -E , то оператор | не следует экранировать, как показано ниже:
grep -E 'fatal|error|critical' /var/log/nginx/error.log
Печать строк перед совпадением
Чтобы напечатать определенное количество строк перед сопоставляемыми строками, используйте опцию -B (или --before-context ).
Например, чтобы отобразить пять строк начального контекста перед сопоставляемыми строками, можно использовать следующую команду:
grep -B 5 root /etc/passwd
Печать строк после совпадения
Чтобы напечатать определенное количество строк после сопоставляемых строк, используйте опцию -A (или --after-context ).
Например, чтобы отобразить пять строк конечного контекста после сопоставляемых строк, можно использовать следующую команду:
grep -A 5 root /etc/passwd
Заключение
Команда grep позволяет искать шаблон внутри файлов. Если совпадение найдено, grep выводит строки, содержащие указанный шаблон.
Более подробную информацию о Grep можно найти на странице «Руководство пользователя Grep» .
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства