Любой Linux администратор сталкивался с командой grep, которая используется для поиска строк по шаблону в стандартных потоках и текстовых файлах.
Изначально grep был написан одним из основателей UNIX Кеном Томпсоном, когда его начальник Дуглас Макилрой попросил его написать инструмент «для поиска чего-нибудь в файлах». Название утилиты происходит от global regular expression print (глобальный вывод регулярных выражений)
Самый частый сценарий использования grep, когда нам нужно отфильтровать поток ввода-вывода, например:
dpkg -l | grep gimp
Также он может работать и с файлами, хотя многие используют совершенно излишнее:
cat file.txt | grep mystring
В то время, когда можно просто использовать:
grep mystring file.txt
Но бывает недостаточно просто найти искомое значение, часто бывает нужно получить также его контекст, это, например, важно при разборе логов, для этого используйте специальные ключи:
▫️A (after) – выводит указанное число сток после вхождения
▫️B (before) – выводит указанное число строк до вхождения
▫️С (context) – выводит указанное число строк до и после вхождения.
Например, если нам нужно вывести следующие пять строк после найденного вхождения используйте:
grep -A5 mystring file.txt
Если вам наоборот нужно сократить вывод и найти только вхождения, то используйте ключ -o, его удобно сочетать с ключом -n, который выводит номера строк.
Например:
grep -no mystring file.txt
Выдаст:
5:mystring
9:mystring
25:mystring
Также grep умеет искать по нескольким файлам сразу, в этом случае перед выводом искомой строки будет указано имя файла, если вам нужно вывести только имена файлов, в которых найдены вхождения используйте ключ -l:
grep -l mystring file.txt file1.txt file2.txt file3.txt
И наоборот, ключ
-L позволяет вывести имена файлов в которых вхождение не найдено.Для того, чтобы игнорировать регистр символов предназначен ключ -i, а ключ -v инвертирует шаблон запроса, так команда:
grep -v mystring file.txt
Выведет те строки, где нет вхождения указанного шаблона, часто применяется для того, чтобы вывести содержимое конфигурационного файла без комментариев.
И, наконец, grep может использовать регулярные выражения, для этого укажите ключ -E, например, поиск российских телефонных номеров в файле:
grep -E ^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$ file.txtНесмотря на то, что grep понимает многие подстановочные символы при использовании поиска по регулярным выражениям рекомендуется всегда использовать ключ -E, что позволит избежать неожиданных результатов.
В этом месте читатели могут вспомнить утилиту egrep, но в настоящий момент она, как и fgrep, объявлена устаревшей и лучше отвыкать от ее использования.
Несмотря на то, что указанные утилиты сохраняются практически во всех дистрибутивах для обеспечения обратной совместимости лучше сразу переходить на актуальные grep -E и grep -F.
Кстати, grep -F – это полная противоположность grep -E, данный ключ предписывает игнорировать метасимволы и подстановочные данные и будет искать строку как есть:
Например:
grep -F 2*(x+y)^2 file.txt
Будет искать строго то, что написано, это может понадобится при поиске специфической информации, скажем, математических выражений, как в этом примере.
