Linux. Команда grep
Команда находит в одном или нескольких файлах строки, совпадающие с указанным шаблоном. Если в команде указано несколько файлов, каждая найденная строка предваряется именем файла. Кроме того, она позволяет отфильтровать вывод другой команды.
Первый вариант использования, поиск шаблона в файле или файлах
$ 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