Linux. Команда grep

17.02.2018

Теги: BashCLILinuxRegExpКомандаШаблон

Команда находит в одном или нескольких файлах строки, совпадающие с указанным шаблоном. Если в команде указано несколько файлов, каждая найденная строка предваряется именем файла. Кроме того, она позволяет отфильтровать вывод другой команды.

Первый вариант использования, поиск шаблона в файле или файлах

$ grep [опции] шаблон файл(ы)
$ grep 'ivanov@mail.ru' /some/path/data/*.xml
/some/path/data/090931-3659.xml:   <Email>ivanov@mail.ru</Email>
/some/path/data/091002-3663.xml:   <Email>ivanov@mail.ru</Email>
/some/path/data/091050-3677.xml:   <Email>ivanov@mail.ru</Email>
$ grep 'ivanov@mail.ru' $(find /some/path/data -name '*.xml')
/some/path/data/090931-3659.xml:   <Email>ivanov@mail.ru</Email>
/some/path/data/091002-3663.xml:   <Email>ivanov@mail.ru</Email>
/some/path/data/091050-3677.xml:   <Email>ivanov@mail.ru</Email>

Второй вариант использования, фильтрация вывода другой команды

$ команда | grep [опции] шаблон
$ find /some/path/data -type f -mmin -10 | grep 'xml$' # xml-файлы, измененные за последние 10 минут
/some/path/data/2023.03.23_12.24.48.xml
/some/path/data/2023.03.23_12.27.47.xml
/some/path/data/2023.03.23_12.30.47.xml
$ cat /some/path/data.xml | grep -n 'ivanov@mail.ru'
35:   <Email>ivanov@mail.ru</Email>
67:   <Email>ivanov@mail.ru</Email>
93:   <Email>ivanov@mail.ru</Email>
$ ls -la /some/path/data | grep '23 1[78]:'
-rw-rw-r-- 1 evgeniy evgeniy   70500 мар 23 17:00 20230323170047.xml
-rw-rw-r-- 1 evgeniy evgeniy   89705 мар 23 17:30 20230323173047.xml
-rw-rw-r-- 1 evgeniy evgeniy   96162 мар 23 18:00 20230323180048.xml
-rw-rw-r-- 1 evgeniy evgeniy  124518 мар 23 18:30 20230323183048.xml

Еще одни вариант использования find и grep — несколько необычный. Команда find позволяет найти файлы по множеству критериев, а потом grep ищет внутри этих файлов совпадение с шаблоном.

$ find /some/path/data -name '*.xml' -exec 'grep' '-H' 'ivanov@mail.ru' '{}' ';'
/some/path/data/090931-3659.xml:   <Email>ivanov@mail.ru</Email>
/some/path/data/091002-3663.xml:   <Email>ivanov@mail.ru</Email>
/some/path/data/091050-3677.xml:   <Email>ivanov@mail.ru</Email>

Справку по команде можно получить с помощью опции help.

$ grep --help
Использование: grep [ПАРАМЕТР]… ШАБЛОНЫ [ФАЙЛ]…
Поиск ШАБЛОНОВ в каждом ФАЙЛЕ.
Пример: grep -i 'hello world' menu.h main.c
ШАБЛОНОВ можно указать несколько, разделяя их символом новой строки.

Шаблон выбора и его интерпретация:
  -E, --extended-regexp  ШАБЛОНЫ — расширенные регулярные выражения
  -F, --fixed-regexp     ШАБЛОНЫ — строки
  -G, --basic-regexp     ШАБЛОНЫ — простые регулярные выражения
  -P, --perl-regexp      ШАБЛОНЫ — регулярные выражения языка Perl
  -e, --regexp=ШАБЛОНЫ   использовать ШАБЛОНЫ для поиска
  -f, --file=ФАЙЛ        брать ШАБЛОНЫ из ФАЙЛа
  -i, --ignore-case      игнорировать различие регистра
      --no-ignore-case   учитывать регистр (по умолчанию)
  -w, --word-regexp      совпадение обязательно с целым словом
  -x, --line-regexp      совпадение обязательно с целой строкой
  -z, --null-data        строки разделяются байтом с нулевым значением, а не
                         символом конца строки

Разное:
  -s, --no-messages         не показывать сообщения об ошибках
  -v, --invert-match        выбирать не подходящие строки
  -V, --version             показать информацию о версии и закончить работу
      --help                показать эту справку и закончить работу

Управление выводом:
  -m, --max-count=ЧИСЛО     остановиться после указанного
                            ЧИСЛА совпавших строк
  -b, --byte-offset         печатать вместе с выходными строками смещение в
                            байтах
  -n, --line-number         печатать номер строки вместе с выходными строками
      --line-buffered       сбрасывать буфер после каждой строки
  -H, --with-filename       печатать имя файла для каждой выводимой строки
  -h, --no-filename         не начинать вывод с имени файла
      --label=МЕТКА         использовать МЕТКУ в качестве имени файла для
                            стандартного ввода
  -o, --only-matching       показывать только совпавшие непустые части строк
  -q, --quiet, --silent     подавлять весь обычный вывод
      --binary-files=ТИП    считать, что двоичный файл имеет ТИП:
                            «binary», «text» или «without-match».
  -a, --text                тоже, что и --binary-files=text
  -I                        то же, что и --binary-files=without-match
  -d, --directories=ДЕЙСТВ  как обрабатывать каталоги
                            ДЕЙСТВИЕ может быть «read» (читать),
                            «recurse» (рекурсивно) или «skip» (пропускать).
  -D, --devices=ДЕЙСТВ      как обрабатывать устройства, FIFO и сокеты
                            ДЕЙСТВИЕ может быть «read» или «skip»
  -r, --recursive           то же, что и --directories=recurse
  -R, --dereference-recursive                             тоже, но с переходом
                            по всем символьным ссылкам
      --include=МАСКА       обработать только файлы, подпадающие под
                            МАСКУ (файловый шаблон)
      --exclude=МАСКА       пропустить файлы, подпадающие под МАСКУ
      --exclude-from=ФАЙЛ   пропустить файлы, подпадающие под маску
                            файлов из ФАЙЛА
      --exclude-dir=МАСКА   пропустить каталоги, подпадающие под МАСКУ
  -L, --files-without-match печатать только имена ФАЙЛОВ без выбранных строк
  -l, --files-with-matches  печатать только имена ФАЙЛОВ с выбранными строками
  -c, --count               печатать только количество выбранных
                            строк на ФАЙЛ
  -T, --initial-tab         выравнивать табуляцией (если нужно)
  -Z, --null                печатать байт 0 после имени ФАЙЛА

Управление контекстом:
  -B, --before-context=ЧИС  печатать ЧИСЛО строк предшествующего контекста
  -A, --after-context=ЧИС   печатать ЧИСЛО строк последующего контекста
  -C, --context[=ЧИС]       печатать ЧИСЛО строк контекста
  -ЧИСЛО                    то же, что и --context=ЧИСЛО
      --color[=КОГДА],
      --colour[=КОГДА]      использовать маркеры для различия совпадающих
                            строк; КОГДА может быть «always» (всегда),
                            «never» (никогда) или «auto» (автоматически)
  -U, --binary              не удалять символы CR в конце строки
                            (MSDOS/Windows)

Если в качестве ФАЙЛА указан символ «-», то читается стандартный ввод.
Если ФАЙЛ не указан и задан параметр командной строки -r, то читается
текущий каталог «.»  и «-» в противном случае. Если указано менее двух
ФАЙЛОВ, то предполагается -h.

При нахождении совпадений любой строки (или файла, если указан «-L»),
кодом завершения программы будет 0, и 1, если ничего не совпало.
При возникновении ошибок и если не указан параметр -q, кодом
завершения будет 2.

Поиск в одном файле

Работать будем с файлом unix.txt

$ cat unix.txt
The Unix operating system was pioneered by Ken
Thompson and Dennis Ritchie at Bell Laboratories
in the late 1960s. One of the primary goals in
the design of the Unix system was to create an
environment that promoted efficient program
development.

Поиск строки «Unix» в файле unix.txt

$ grep 'Unix' unix.txt
The Unix operating system was pioneered by Ken
the design of the Unix system was to create an
$ cat unix.txt | grep 'Unix'
The Unix operating system was pioneered by Ken
the design of the Unix system was to create an

Поиск строк, содержащих цифры

$ grep '[0-9]' unix.txt
in the late 1960s. One of the primary goals in
$ cat unix.txt | grep '[0-9]'
in the late 1960s. One of the primary goals in

Опция -i ведет поиск без учета регистра

$ grep -i 'the' unix.txt
The Unix operating system was pioneered by Ken
in the late 1960s. One of the primary goals in
the design of the Unix system was to create an
$ cat unix.txt | grep -i 'the'
The Unix operating system was pioneered by Ken
in the late 1960s. One of the primary goals in
the design of the Unix system was to create an

Опция -v позволяет найти строки, которые не содержат указанный шаблон.

$ grep -v 'Unix' unix.txt
Thompson and Dennis Ritchie at Bell Laboratories
in the late 1960s. One of the primary goals in
environment that promoted efficient program
development.
$ cat unix.txt | grep -v 'Unix'
Thompson and Dennis Ritchie at Bell Laboratories
in the late 1960s. One of the primary goals in
environment that promoted efficient program
development.

Опция -n выводит номера строк файла, в которых найдено совпадение с шаблоном.

$ grep -n 'Unix' unix.txt
1:The Unix operating system was pioneered by Ken
4:the design of the Unix system was to create an
$ cat unix.txt | grep -n 'Unix'
1:The Unix operating system was pioneered by Ken
4:the design of the Unix system was to create an

Поиск в директории

Поиск совпадений во всех файлах директории

$ grep 'шаблон' example/*

Опция -l позволяет получить только список файлов, в которых было найдено совпадение.

$ grep -l 'шаблон' example/*

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

$ grep -L 'шаблон' example/*

Опция -r заставляет grep рекурсивно обследовать все дерево указанной директории, то есть все поддиректории вплоть до файлов.

$ grep -r 'шаблон' /home

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

Команда grep поддерживает два типа регулярных выражений: базовый (BRE — basic regular expressions) и расширенный (ERE — extended regular expressions). По умолчанию grep использует базовый тип регулярных выражений.

В BRE распознаются следующие метасимволы

^ $ . [ ] *

Все другие символы расцениваются как литералы. В ERE добавлены следующие метасимволы (и связанные с ними функции).

( ) { } ? + |

Тем не менее, символы «(», «)», «{» и «}» в BRE обрабатываются как метасимволы, если они экранированы обратным слешом; в то время как в ERE постановка перед любыми метасимволами обратного слеша приводит к тому, что они трактуются как литералы.

Опция -E команды grep позволяет использовать расширенные регулярные выражения.

Поиск: Bash • CLI • Linux • RegExp • Команда • Шаблон • grep

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.