yandex

Команда grep в Linux: как искать строки и шаблоны

Дарим до 20 000 бонусов
для юрлиц и ИП
Подробнее
Avatar icon

Марина Суворова

Главный редактор блога

Статья

Время чтения

7 минут

Чтобы быстро находить ошибки и отслеживать предупреждения в лог-файлах Linux-приложений или самой системы, администраторы и разработчики используют команду grep. Она упрощает просмотр и анализ логов, позволяя эффективно искать и обрабатывать текстовые шаблоны в файлах. В этой статье рассмотрим задачи, которые можно решать с помощью grep. 

Синтаксис команды grep

Основной синтаксис команды grep выглядит следующим образом:

grep [опции] шаблон [<путь к файлу или папке>]

В нее входят: 

  • [опции] — флаги командной строки, которые изменяют поведение grep;

  • шаблон — регулярное выражение, которое нужно найти;

  • [<путь к файлу или папке>] — имя одного или нескольких файлов, в которых необходимо выполнить поиск. 

Как применять команду grep в Linux

Приведем примеры использования grep на практике, а также обсудим, какие флаги командной строки используются:

  • -i — ищем строку без учета регистра в указанном файле. Например, найдем строки с  UNIX, Unix, unix командой: 

grep -i "UNix" geekfile.txt.

Использование опции -i
Использование опции -i
  • -c — находим количество строк, которые соответствуют заданному шаблону: 

grep -c "unix" geekfile.txt.

  • -l — отображаем файлы, которые содержат заданную строку или шаблон: 

grep -l "unix" * или grep -l "unix" f1.txt f2.txt f3.xt f4.txt.

  • -w — по умолчанию grep сопоставляет нужную строку, даже если она найдена как подстрока в файле. А параметр -w позволяет отображать только целые слова: 

grep -w "unix" geekfile.txt.

Применение параметра -w
Применение параметра -w
  • -o — по умолчанию grep показывает всю строку, которая совпала по запросу. Но при помощи опции -o можно выбрать только определенное словосочетание: 

grep -o "unix" geekfile.txt.

  • -n — отображаем номер строки файла с совпавшей строкой: 

grep -n "unix" geekfile.txt.

  • -v — находим строки, которые не соответствуют указанному шаблону строки поиска: 

grep -v "unix" geekfile.txt.

  • ^ — этот параметр определяет начало строки. В grep его можно использовать для сопоставления строк, которые начинаются с заданного шаблона: 

grep "^unix" geekfile.txt.

  • — используется как якорь конца строки, позволяя искать строки, заканчивающиеся на определенный шаблон или набор символов: 

grep "os$" geekfile.txt.

  • -e — задаем выражение с этой опцией, которое можно использовать несколько раз: 

grep -e "Agarwal"-e "Aggarwal" -e "Agrawal" geekfile.txt.

  • -f — берем шаблоны из файла по одному на строку:

cat pattern.txt
Agarwal
Aggarwal
Agrawal
grep –f pattern.txt geekfile.txt

  • «-A», «-B», «-C» — извлекаем строку с текстовым совпадением, включая некоторое количество строк (n), предшествующих и следующих за ней:

-A — строки после вхождения;

grep -A[КоличествоСтрок(n)] [поиск] [файл]

-B — строки до вхождения;

grep -B[КоличествоСтрок(n)] [поиск] [файл]

-C — строки до и после вхождения.

grep -C[КоличествоСтрок(n)] [поиск] [файл]

В итоге команда может выглядеть так:

grep -A 2 «error» application.log

  • -R (или -r) — ищем текстовое вхождение во всех файлах внутри директории и ее поддиректорий.

grep -r --color=always 'vivek' /etc/passwd

При этом:

  • --color позволяет отображать вывод в цвете и упрощает чтение кода.

Применение опции --color
Применение опции --color

В дополнение к красному по умолчанию для вывода можно определять цвета с помощью переменной оболочки GREP_COLOR. 

Сохранение вывода grep в файл

Допустим, вам необходимо выполнить поиск по ключевому слову cloud и сохранить вывод в файле с именем my-cloud.txt. Тогда вводим такую команду: 

$ grep cloud squid.conf > my-cloud.txt.

Также можно выполнить ограниченный поиск, включив в него строки, которые начинаются с ключевого cloud:

$ grep -w '^cloud' squid.conf > my-cloud.txt.

Поиск специальных символов с помощью grep

Если нужно найти определенный символ, можно попросить grep обрабатывать ваш ввод как фиксированную строку с помощью опции -F или команды fgrep. 

Например:

## Match '[xyz]' in the filename ##
fgrep '[xyz]' filename #deprecated syntax
grep -F '[xyz]' filename

Подавление сообщений об ошибках

С помощью grep можно не выводить на экран ошибки о несуществующих или нечитаемых файлах через использование параметра -s:

Например:

$ grep -R -i -s 'regex' /etc/
$ grep -R -i -s 'vivek' /etc/

Регулярные выражения в grep

Регулярные выражения — инструмент для определения общих шаблонов поиска, расширяющий спектр возможностей обработки текстовой информации. Они  представляют собой некую последовательность символов. Например, ^w1, w1|w2, [^ ], foo, bar, [0-9].

Команда grep располагает базовыми и расширенными выражениями:

  1. Базовые (BRE) выражения предоставляют набор символов: ., *, [], [^], ^ и $.

  2. Расширенные (ERE) выражения в дополнение к базовым поддерживают следующие символы: +, ?,{n,m},|.

Основные регулярные выражения:

Параметр

Что означает

.

Соответствует любому отдельному символу

?

Предыдущий элемент — необязательный и будет сопоставлен максимум один раз

*

Предыдущий элемент будет совпадать ноль или более

раз

+

Предыдущий элемент будет сопоставлен один или несколько

раз

{N}

Предыдущий элемент совпадает ровно N раз

{N,}

Предыдущий элемент совпадает N или более раз

{N,M}

Предыдущий элемент совпадает не менее N раз, но не более M раз

-

Представляет диапазон, если он не является первым или

последним в списке, или конечной точкой диапазона в списке

^

Соответствует пустой строке в начале строки. Также представляет символы, не входящие в диапазон списка

$

Соответствует пустой строке в конце строки

\b

Соответствует пустой строке на окончании слова

\B

Соответствует пустой строке, если она не находится на окончании слова

\<

Найти пустую строку в начале слова

\>

Найти пустую строку в окончании слова

Примеры регулярных выражений grep

Чтобы продемонстрировать, как работают регулярные выражения grep, найдем слово с именем cloud в файле /etc/passwd:

$ grep 'cloud' /etc/passwd

Как вывод получим:

cloud :x:1000:1000:Cloud Gite,,,:/home/cloud:/bin/bash
cloud gite:x:1001:1001::/home/cloudgite:/bin/sh
git cloud :x:1002:1002::/home/gitecloud:/bin/sh

Далее найдем слово с именем cloud в любом регистре: 

$ grep -i -w 'cloud' /etc/passwd

И после этого выполним поиск двух слов clou» или raj в любом регистре:

$ grep -E -i -w 'cloud|raj' /etc/passwd

Теперь найдем слова Linux или UNIX в любом регистре с применением команды egrep:

$ egrep -i '^(linux|unix)' filename
# Same as above by passing the '-E' to the grep #
$ grep -E -i '^(linux|unix)' filename

Важно учесть, что последняя версия egrep покажет предупреждение, что команда устарела и нужно использовать grep -E. Чтобы этого избежать, следует обновить скрипты и команды. Правильный запрос будет выглядеть так: 

$ grep -E -i 'foo|bar' /path/to/file вместо $ egrep -i 'foo|bar' /path/to/file.

Как сопоставить отдельные символы

Символ . (точка) соответствует одному элементу. То есть его можно использовать в качестве замены любого другого символа. 

Чтобы показать, как это выглядит на практике, возьмем файл demo.txt:

$ cat demo.txt
foo.txt
bar.txt
foo1.txt
bar1.doc
foobar.txt
foo.doc
bar.doc
dataset.txt
purchase.db
purchase1.db
purchase2.db
purchase3.db
purchase.idx
foo2.txt
bar.txt

Найдем все имена файлов, которые начинаются с purchase: 

$ grep 'purchase' demo.txt.

После чего выделим все имена файлов, которые начинаются с purchase и заканчиваются на db: 

$ grep 'purchase.db' demo.txt.

А также, для примера, найдем все имена файлов, которые начинаются с purchase, но заканчиваются на db: 

$ grep 'purchase..db' demo.txt.

Список файлов с определенным началом имени и окончанием
Список файлов с определенным началом имени и окончанием

Как сопоставить только точку (.)

Точка играет особую роль в регулярных выражениях, так как соответствует любому символу. Однако, если необходимо не заменять, а искать именно фактическую точку, можно воспользоваться опцией экранирования. 

Для этого перед . нужно поставить обратную косую черту \:

$ grep 'purchase..' demo.txt
$ grep 'purchase.\.' demo.txt

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

Как использовать якоря

Чтобы заставить регулярное выражение сопоставлять только начало или конец строки, можно применять якоря ^ и $. Чтобы отобразить строки, которые начинаются с cloud, нужно ввести: 

$ grep -R ^cloud /etc/passwd

Примеры выходных данных:

cloud :x:1000:1000:Cloud Gite,,,:/home/cloud:/bin/bash
cloud gite:x:1001:1001::/home/cloudgite:/bin/sh

Также можно отобразить только строки, которые начинаются со слова cloud, то есть не выводить cloudgite, cloudg и т.д.: 

$ grep -R '^cloud$' /etc/passwd

Как сопоставить набор символов с помощью grep

Так как точка . соответствует любому отдельному символу, с помощью grep можно сопоставлять определенные символы и их диапазоны. Представим, что необходимо сопоставить Vivek и vivek: $ grep '[vV]ivek' filename или $ grep '[vV][iI][Vv][Ee][kK]' filename

Сопоставим цифры и символы верхнего и нижнего регистра. Например, попробуем посчитать слова, такие как vivek1, Vivek2 и так далее, с помощью:

$ grep -w '[vV]ivek[0-9]' filename

Или сопоставив foo11, foo12, foo22 через:

$ grep 'foo[0-9][0-9]' filename

Также можно использовать не только цифры, но и буквы: $ grep '[A-Za-z]' filename.

Например, отобразим все строки, в которых содержатся символы w или n: 

$ grep [wn] filename

Какие универсальные символы существуют

Помимо стандартных символов, у которых есть конкретные задачи, существуют и универсальные. 

Поиск по шаблону с символом -

Найдем все строки, которые соответствуют –test– с использованием опции -e Без нее grep попытается проанализировать –test– как список опций. Например:

$ grep -e '--test--' filename

Операция OR

Если необходимо сопоставить несколько текстовых выражений, можно применить опцию OR. Используем следующий синтаксис:

$ grep -E 'word1|word2' filename
### OR ###
$ egrep 'word1|word2' filename
$ grep 'word1\|word2' filename

Операция AND

Используем следующий синтаксис для отображения всех строк, в которых содержатся как word1, так и word2: 

$ grep 'word1' filename | grep 'word2' или $ grep 'foo.*bar\|word3.*word4' filename

Как проверить последовательность

Чтобы проверить, как часто символ должен повторяться в последовательности, используйте следующий синтаксис: {N}, {N,}, {min,max}.

Например:

  • Сопоставляем символ v два раза: 

$ egrep "v{2}" filename

  • Следующий пример будет соответствовать как словам co», так и cool: 

$ egrep 'co{1,2}l' filename

  • Этот пример будет соответствовать любой строке из как минимум трех букв c:

$ egrep 'c{3,}' filename

Коротко о команде grep в Linux

В комьюнити разработчиков распространено слово «грепать» — то есть искать какое-либо регулярное выражение в большом объеме файлов. Делать это позволяет универсальная утилита grep, которую можно применять для работы с любыми доступными в Cloud.ru Linux-дистрибутивами

Владение grep помогает искать файл с конкретной строкой в файловой системе или, наоборот, строки в файле, где содержатся определенные символы. А комбинируя все ее функциональные возможности, можно решать самые разные задачи поиска.

Содержание

  • Синтаксис команды grep
  • Как применять команду grep в Linux
  • Регулярные выражения в grep
  • Примеры регулярных выражений grep
  • Как сопоставить отдельные символы
  • Как сопоставить только точку (.)
  • Как использовать якоря
  • Как сопоставить набор символов с помощью grep
  • Какие универсальные символы существуют
  • Как проверить последовательность
  • Коротко о команде grep в Linux

Вам может понравиться