Слово "грепать" входит в топ самых популярных терминов, используемых разработчиками. Оно происходит от одноимённой консольной утилиты grep (global regular expression print), выполняющей поиск по файлу или файлам определённого текста. Грепать для разработчиков — то же самое, что гуглить для тех, кто активно пользуется интернетом. Как правило, грепают файлы с исходным кодом или логи во время отладки.
$ man grep
SYNOPSIS
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN]... [-f FILE]... [FILE...]
PATTERN — это то, что ищется, необязательно конкретная строчка, возможно определённый шаблон (см. регулярные выражения). FILE — путь до файла, в котором нужно искать
# Поиск всех строк в файле .bashrc, в которых встречается слово aliases
$ grep aliases .bashrc
# enable color support of ls and also add handy aliases
# some more ls aliases
# ~/.bash_aliases, instead of adding them here directly.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
В примере выше grep нашёл 5 строк. Найденные строчки выводятся на экран в том же порядке, в котором они встречаются в исходном файле. В некоторых ситуациях бывает важно увидеть не только саму строку, содержащую подстроку, но и то, что находится вокруг неё. Количество выводимых соседних строк регулируется опциями -B, -A и -C. Первая определяет количество отображаемых строк до искомой (-B, --before-context), вторая — после (-A, --after-context), а третья — до и после одновременно (-C, --context). Ниже пример использования -C со значением 1. Это значит, что для каждой найденной строки будет выведена одна строка выше и одна строка ниже.
$ grep -C 1 aliases .bashrc
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
--
# some more ls aliases
alias ll='ls -alF'
--
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Иногда мы не знаем, в каком файле то, что мы ищем, но знаем директорию, в которой лежит этот файл. В такой ситуации нужно сделать два изменения:
- Добавить опцию
-R, которая говорит о том, что надо искать внутри директории (рекурсивно, то есть включая все поддиректории). - Указать путь до директории, а не файла.
В примере ниже мы ищем тег BODY во всех файлах текущей папки
$ grep -R body
comand_line.html: <body>
comand_line.html: </body>
New.html: <body>
New.html: </body>
files.html: <body>
files.html: </body>
Grep.html: <body>
Grep.html: </body>
navigation.html: <body>
navigation.html: </body>
interfase.html: <body>
interfase.html: </body>
При таком поиске в выводе указывается файл, в котором была найдена строка. Если добавить опцию n, то дополнительно отобразится номер строки.
$ grep -Rn body
comand_line.html:12:
comand_line.html:73:
New.html:12:
New.html:21:
files.html:12:
files.html:157:
Grep.html:12:
Grep.html:100:
navigation.html:12:
navigation.html:113:
interfase.html:12:
interfase.html:105: