Примеры команд grep в Linux
Grep — полезная команда, которая поможет вам быстро искать и находить содержимое файлов.
«В Linux все является файлом», и именно по этой причине большинство пользователей Linux тратят много времени на изменение содержимого файла.
Именно здесь важность команды grep играет решающую роль, позволяя вам искать и сопоставлять шаблоны в текстовых файлах или получать выходные данные.
Итак, в этом уроке я познакомлю вас со всем необходимым для изучения команды grep:
Основной синтаксис и популярные флаги команды
-
Практические примеры использования команды
Практикумы по команде grep
Вот как использовать команду grep
Чтобы использовать команду grep, важно знать ее синтаксис.
Итак, вот основной синтаксис команды grep:
grep [OPTIONS] PATTERN <Filename>
Здесь,
[OPTIONS]
: используя данный набор параметров, вы можете изменить поведение команды grep по умолчанию, например, использование-i
включает поиск без учета регистра.ШАБЛОН
: здесь вы указываете текст, который ищете, из файла или вывода команды. Это также может быть регулярное выражение для более сложных шаблонов.
: здесь вы указываете файл, в котором хотите выполнить поиск, и если вы не укажете какой-либо файл, поиск будет осуществляться из стандартного ввода.
Теперь давайте посмотрим на некоторые часто используемые параметры команды grep:
-i
Игнорирует чувствительность к регистру при поиске.
-v
-
Печатает строки, не соответствующие шаблону.
-n
Отображает номер каждой соответствующей строки.
-w
Соответствует только целым словам, а не частям слов.
-c
Подсчитывает количество совпадающих строк, но не печатает строки.
-r
Рекурсивный поиск по каталогам.
-A n
Печатает n строк после каждой совпадающей строки.
-B n
Печатает n строк перед каждой совпадающей строкой.
-C n
Печатает n строк до и после каждой совпадающей строки.
-f Filename
Считывает шаблоны поиска из файла, по одному на строку.
-o
Печатает только совпавшую часть строки.
Вам может быть интересно: что произойдет, если вы используете команду grep без каких-либо параметров? Ну, он просто печатает строки, содержащие шаблон.
Например, здесь я хочу найти ключевое слово error
в файле с именем error.log
, и без каких-либо дополнительных опций он дал мне следующий результат:
Ты это видел? Он выделяет найденный шаблон, а также печатает строки, содержащие этот шаблон.
Чтобы облегчить понимание этого руководства, я буду использовать пример файла с именем error.log
, который включает следующие строки:
This is a log file with various messages.
An error occurred at 10:00 AM.
The system encountered an unexpected issue.
Everything is working normally now.
Another error message at 11:30 AM.
Warning: Please check disk usage.
Log closed at 12:00 PM
Практические примеры команды grep
В этом разделе я рассмотрю различные примеры команды grep, чтобы вы могли лучше понять, как ее использовать.
1. Поиск без учета регистра
По умолчанию шаблоны команд grep чувствительны к регистру, и по большей части они работают хорошо, но вы можете отключить чувствительность к регистру.
Для этого вы можете использовать флаг -i
, как показано здесь:
grep -i PATTERN Filename
Чтобы продемонстрировать это, я буду использовать ERROR
в качестве шаблона поиска, и он будет отображать соответствующие шаблоны независимо от чувствительности к регистру:
grep -i ERROR error.log
2. Показать строки n
до и после совпадающих строк.
По умолчанию команда grep печатает только совпадающие строки, но иногда вам нужен контекст совпадающих строк. Таким образом, вы печатаете строки до и после совпадающих строк.
Печатать n
строк перед совпадающими строками
Чтобы напечатать n строк перед совпадающими строками, вы используете флаг -B
и указываете количество строк для печати, как показано здесь:
grep -B <number_of_lines> PATTERN Filename
Например, здесь я напечатал одну строку перед каждой совпадающей строкой:
grep -B 1 error error.log
Распечатать n
строк после совпадающих строк.
Чтобы напечатать n строк после совпадающих строк, вы используете флаг -A
и указываете количество строк, как показано здесь:
grep -A <number_of_lines> PATTERN Filename
Если я хочу напечатать одну строку после совпадающих строк, я буду использовать следующее:
grep -A 1 error error.log
Распечатать n
строк до и после совпадающих строк
Если вы хотите напечатать строки до и после, используйте флаг -C
и укажите количество строк для печати, как показано здесь:
grep -C <number_of_lines> PATTERN Filename
Допустим, я хочу отобразить 1 строку до и 1 строку после соответствующей строки шаблона, тогда я буду использовать следующее:
grep -C 1 error error.log
3. Показать линии, не соответствующие шаблону
По большей части вы будете использовать команду grep для сопоставления шаблонов, но она также позволяет инвертировать результаты поиска.
Проще говоря, вы указываете поисковый запрос, и он печатает строки, не соответствующие заданному шаблону, и для этой цели вы используете флаг -v
, как показано здесь:
grep -v PATTERN Filename
Например, если я хочу напечатать каждую строку, не содержащую термин error
, я буду использовать следующее:
grep -v error error.log
4. Отображение количества совпадающих строк
Чтобы отобразить количество совпадающих строк, все, что вам нужно сделать, это использовать флаг -n
, как показано:
grep -n PATTERN Filename
5. Отображение общего количества совпавших результатов.
Если вы хотите узнать количество совпадающих результатов, вы можете использовать флаг -c
, как показано:
grep -c PATTERN Filename
Например, здесь я хотел узнать, сколько раз термин error
упоминается в файле error.log
, поэтому я использовал следующую команду:
grep -c error error.log
6. Поиск шаблона в нескольких файлах
Если вы хотите выполнить поиск шаблона в нескольких файлах, все, что вам нужно сделать, это добавить несколько файлов для поиска, как показано здесь:
grep PATTERN File1 File2
Например, здесь я искал строку error
в двух файлах: error.log
и error.txt
и получил следующий результат: :
grep error error.log error.txt
7. Поиск по шаблону из каждого файла в каталоге.
Если вы хотите найти определенный шаблон в каждом файле, присутствующем в каталоге, вы можете использовать команду grep рекурсивно, и она будет искать данный шаблон в каждом файле, присутствующем в этом конкретном каталоге.
Чтобы включить рекурсивный поиск, используйте флаг -r
, как показано:
grep -r PATTERN <Directory or path to directory>
Например, здесь я искал строку error
в текущем каталоге:
grep -r error .
8. Найдите точное слово
По умолчанию команда grep распечатает все соответствующие шаблоны, а это не то, что вам всегда нужно. Звучит странно? Позвольте мне объяснить.
Предположим, вы хотите найти термин Апельсины
, но если конкретный файл также содержит термин Апельсины
, то строка, содержащая термин Апельсины
, также будет показано как результат.
Чтобы решить эту проблему, вы можете использовать опцию -w
и указать шаблон:
grep -w PATTERN Filename
Например, здесь я собираюсь найти термин err
, поэтому я буду использовать флаг -w
, а также покажу вам разницу между тем, что происходит, когда вы не используете это.
grep -w err error.log
Когда я использовал флаг -w
, чтобы найти строку err
, она не дала результатов, поскольку она не существует.
Но во второй попытке, когда я удалил флаг -w
, были возвращены два результата, отображающие содержимое, в котором шаблон строки является частью другой строки (а не отдельной).
9. Используйте шаблон регулярного выражения для расширенного поиска.
Если обычный поиск не дает должного результата, вы можете использовать шаблон регулярного выражения (последовательность символов), чтобы лучше контролировать поиск. Вы можете использовать флаг -e
для использования шаблона регулярного выражения, тогда как -E
позволяет использовать расширенное регулярное выражение:
grep -e/-E PATTERN Filename
Например, здесь я использовал расширенное регулярное выражение, чтобы найти две гласные, используемые вместе в файле:
grep -e '[aeiouAEIOU]{2}' error.log
Рекомендуется прочитать 📖
10. Укажите несколько шаблонов с помощью оператора OR.
Вы можете использовать оператор OR для указания нескольких шаблонов, что весьма полезно, если вы хотите эффективно искать несколько шаблонов.
Чтобы указать несколько шаблонов, используйте оператор OR (|) следующим образом:
grep 'PATTERN_1\|PATTERN_2' Filename
Допустим, я хочу найти два шаблона: error
и Please
, тогда я буду использовать следующее:
grep 'error\|Please' error.log
Практические вопросы 📓
Практика — лучший способ научиться, и именно поэтому я собираюсь поделиться некоторыми практическими вопросами по команде grep.
Вы можете использовать файл error.log
, о котором я упоминал в начале этого руководства, для решения следующих вопросов:
Найдите строку
error
в каждом файле, присутствующем в вашем рабочем каталоге.Найдите строки, которые не содержат термин
успех
.Найдите в файле строки, содержащие либо
ошибку
, либопроблему
.Найдите термин
log
, отключив поиск с учетом регистра и перенаправив вывод в файл.Как распечатать только два последних результата, игнорируя все остальное? (Подсказка: используйте команду Tail)
Если вы обнаружите какие-либо трудности с решением вышеуказанных проблем, свяжитесь с нами через комментарии или разместите свой вопрос на форуме нашего сообщества.
Вы можете скачать шпаргалку по команде grep для получения дополнительных примеров и информации:
Вы опытный пользователь? Попробуйте рипгреп
Команда ripgrep выполняет все те же действия, что и команда grep, но имеет некоторые дополнительные преимущества, такие как производительность и функции, включая возможность поиска в zip-файле.
Звучит круто? Вот как установить и использовать ripgrep в Linux:
Более того, если вы новичок в Linux, я предлагаю вам также пройти наше руководство по командам для начинающих.
💬Поделитесь своими мыслями о команде, своим опытом работы с ней и что вы предпочитаете в качестве альтернативы grep?