Найти в Дзене

Используем grep для поиска в файлах и потоках

Любой 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) – выводит указа

Используем grep для поиска в файлах и потоках

Любой 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

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