Утилита grep поиск внутри файлов в Linux
Иногда может понадобиться найти файл, в котором содержится определённая строка или найти строку в файле, где есть нужное слово. В Linux для этого существует несколько утилит, одна из самых используемых это grep
.
Синтаксис утилиты grep
:
grep опции шаблон путь_к_файлу_или_папке
Опции
это дополнительные параметры, с помощью которых указываются различные настройки поиска и вывода, например количество строк или режим инверсииШаблон
это любая строка или регулярное выражение, по которому будет выполняться поискИмя файла или папки
это то место, где будет выполняться поиск. Как вы увидите дальше,grep
позволяет искать в нескольких файлах и даже в каталоге, используя рекурсивный режим
Опции
Давайте рассмотрим самые основные опции утилиты, которые помогут более эффективно выполнять поиск текста в файлах grep
:
-E, --extended-regexp
включить расширенный режим регулярных выражений (ERE)-F, --fixed-strings
рассматривать шаблон поиска как обычную строку, а не регулярное выражение-G, --basic-regexp
интерпретировать шаблон поиска как базовое регулярное выражение (BRE)-P, --perl-regexp
рассматривать шаблон поиска как регулярное выражение Perl-e, --regexp
альтернативный способ указать шаблон поиска, опцию можно использовать несколько раз, что позволяет указать несколько шаблонов для поиска файлов, содержащих один из них-f, --file
читать шаблон поиска из файла-i, --ignore-case
не учитывать регистр символов-v, --invert-match
вывести только те строки, в которых шаблон поиска не найден-w, --word-regexp
искать шаблон как слово, отделенное пробелами или другими знаками препинания-x, --line-regexp
искать шаблон как целую строку, от начала и до символа перевода строки-c
вывести количество найденных строк--color
включить цветной режим, доступные значения:never, always и auto
-L, --files-without-match
выводить только имена файлов, будут выведены все файлы в которых выполняется поиск-l, --files-with-match
аналогично предыдущему, но будут выведены только файлы, в которых есть хотя бы одно вхождение-m, --max-count
остановить поиск после того как будет найдено указанное количество строк-o, --only-matching
отображать только совпавшую часть, вместо отображения всей строки-h, --no-filename
не выводить имя файла-q, --quiet
не выводить ничего-s, --no-messages
не выводить ошибки чтения файлов-A, --after-content
показать вхождение и n строк после него-B, --before-content
показать вхождение и n строк перед ним-C
показать n строк до и после вхождения-a, --text
обрабатывать двоичные файлы как текст--exclude
пропустить файлы имена которых соответствуют регулярному выражению--exclude-dir
пропустить все файлы в указанной директории-I
пропускать двоичные файлы--include
искать только в файлах, имена которых соответствуют регулярному выражению-r
рекурсивный поиск по всем подпапкам-R
рекурсивный поиск включая ссылки
Поиск текста в файле
В первом примере мы будем искать информацию о пользователе root
в файле со списком пользователей Linux /etc/passwd
. Для этого выполните следующую команду:
grep root /etc/passwd
С помощью опции -i
можно указать, что регистр символов учитывать не нужно. Например, давайте найдём все строки содержащие вхождение слова time в том же файле. В этом случае Time
, time
, TIME
и другие вариации слова будут считаться эквивалентными.:
grep -i "time" /etc/passwd
Можно указать несколько условий для поиска, используя опцию -e
:
grep -e "root" -e "daemon" /etc/passwd
C помощью опции -n
можно выводить номер строки, в которой найдено вхождение:
grep -n 'root' /etc/passwd
Это всё хорошо работает пока ваш поисковый запрос не содержит специальных символов. Например, если вы попытаетесь найти все строки, которые содержат символ [
в файле /etc/grub/00_header
, то получите ошибку, что это регулярное выражение не верно. Для того чтобы этого избежать, нужно явно указать, что вы хотите искать строку с помощью опции -F
:
grep -F "[" /etc/grub.d/00_header
Фильтрация вывода команды
Для того чтобы отфильтровать вывод другой команды с помощью grep
достаточно перенаправить его используя оператор |
. А файл для самого grep
указывать не надо. Например, для того чтобы найти все процессы gnome
можно использовать такую команду:
ps aux | grep "gnome"
Регулярные выражения
Утилита grep
поддерживает несколько видов регулярных выражений. Это базовые регулярные выражения BRE
, которые используются по умолчанию и расширенные ERE
.
Базовые регулярные выражения
Базовые регулярные выражение поддерживает набор символов, позволяющих описать каждый определённый символ в строке:
.
любой символ*
совпадение элемента ноль или более раз[]
помогает задать сразу несколько символов[^]
исключает из поиска следующие за^
символы или диапазон символов^
поиск по совпадению начала строки$
получить выборку в которой строки заканчиваются на какое-то выражение
Например, вы можете найти строки, которые начитаются на букву r
:
grep "^r" /etc/passwd
Можно найти строки, которые содержат большие буквы:
grep "[A-Z]" /etc/passwd
Можно найти строки, которые заканчиваются на ready
в файле /var/log/dmesg
:
grep "ready$" /var/log/dmesg
Расширенные регулярные выражения
В дополнение ко всем символам из базового синтаксиса, в расширенном синтаксисе поддерживаются также такие символы:
+
одно или больше повторений предыдущего символа?
ноль или одно повторение предыдущего символа{n,m}
повторение предыдущего символа от n до m раз|
позволяет объединять несколько паттернов
Для активации расширенного синтаксиса нужно использовать опцию -E
. Например, вместо использования опции -e
, можно объединить несколько слов для поиска вот так:
grep -E "root|daemon" /etc/passwd
Вывод контекста
Иногда бывает очень полезно вывести не только саму строку со вхождением, но и строки до и после неё. Например, мы хотим выбрать все ошибки из лог-файла, но знаем, что в следующей строчке после ошибки может содержаться полезная информация, тогда с помощью grep
отобразим несколько строк. Ошибки будем искать в /var/log/dmesg
по шаблону "Error"
:
grep -A4 "Error" /var/log/dmesg
Выведет строку с вхождением и 4 строчки после неё.
Эта команда выведет строку со вхождением и 4 строчки до неё:
grep -B4 "Error" /var/log/dmesg
Эта команда выведет по две строки с верху и снизу от вхождения:
grep -C2 "Error" /var/log/dmesg
Рекурсивный поиск
До этого мы рассматривали поиск в определённом файле или выводе команд. Но grep
также может выполнить поиск текста в нескольких файлах, размещённых в одном каталоге или подкаталогах. Для этого нужно использовать опцию -r
. Например, давайте найдём все файлы, которые содержат строку Kernel
в папке /var/log
:
grep -r "Kernel" /var/log
Папка с вашими файлами может содержать двоичные файлы, в которых поиск выполнять обычно не надо. Для того чтобы их пропускать используйте опцию -I
:
grep -rI "Kernel" /var/log
Некоторые файлы доступны только суперпользователю и для того чтобы выполнять по ним поиск вам нужно запускать grep
с помощью sudo
. Или же вы можете просто скрыть сообщения об ошибках чтения и пропускать такие файлы с помощью опции -s
:
grep -rIs "Kernel" /var/log
Выбор файлов для поиска
С помощью опций --include
и --exclude
вы можете фильтровать файлы, которые будут принимать участие в поиске. Например, для того чтобы выполнить поиск только по файлам с расширением .log
в папке /var/log
используйте такую команду:
grep -r --include="*.log" "Kernel" /var/log
А для того чтобы исключить все файлы с расширением .journal
надо использовать опцию --exclude
:
grep -r --exclude="*.journal" "Kernel" /var/log
Поиск слов
Когда вы ищете строку abc
, grep
будет выводить также kbabc
, abc123
, aafrabc32
и тому подобные комбинации. Вы можете заставить утилиту искать по содержимому файлов, которые включают только искомые слова полностью с помощью опции -w
:
grep -w "root" /etc/passwd
Количество строк
Утилита grep
может сообщить, сколько строк с определенным текстом было найдено файле. Для этого используется опция -c
(счетчик):
grep -c 'Kernel' /var/log/dmesg
Инвертированный поиск
Команда grep
Linux может быть использована для поиска строк, которые не содержат указанное слово. Например, так можно вывести только те строки, которые не содержат слово nologin
:
grep -v nologin /etc/passwd
Вывод имен файлов
Вы можете указать grep
выводить только имена файлов, в которых было хотя бы одно вхождение с помощью опции -l
. Например, следующая команда выведет все имена файлов из каталога /var/log
, при поиске по содержимому которых было обнаружено вхождение Kernel
:
grep -lr 'Kernel' /var/log/
Цветной вывод
По умолчанию grep
не будет подсвечивать совпадения цветом. Но в большинстве дистрибутивов прописан алиас для grep, который это включает. Однако, когда вы используйте команду c sudo
это работать не будет. Для включения подсветки вручную используйте опцию --color
со значением always
:
grep --color=always root /etc/passwd