grep
означает «Global Regular Expression Print». Это полезная утилита командной строки, предоставляемая Linux, для поиска текстовой строки, которая соответствует шаблону, указанному пользователем.
grep
принимает ввод от пользователя в виде строк или слов, которые пользователь хочет найти в определенном файле. Затем команда проверяет указанный пользователем файл на наличие этого шаблона и возвращает строки, которые соответствуют предоставленному шаблону.
Он отлично справляется с фильтрацией содержимого файла, тем самым облегчая нам задачу поиска определенного содержимого в одном или нескольких файлах одновременно.
В этой статье мы подробно рассмотрим функционирование команды grep
на некоторых практических примерах.
Опции, доступные с командой grep
Это некоторые из основных параметров, которые вы будете часто использовать в команде grep
.
Вариант | Описание |
-i | Для поиска без учета регистра |
-r | Для рекурсивного поиска всех файлов в указанном каталоге и его подкаталогах |
-c | Чтобы отобразить общее количество появлений строки |
-v | Для отображения несовпадающих строк |
-w | Фильтр по конкретному слову, используемому отдельно |
Используя команду grep
Команда grep
обычно используется с утилитой pipe (|
). Она может быть реализована с помощью оболочки pipe, когда вы хотите использовать ее с некоторыми другими командами Linux. Хотя, grep
может также использоваться индивидуально без утилиты pipe (|
).
Давайте рассмотрим некоторые основные синтаксисы команды grep
с использованием утилиты pipe и без нее.
Позвольте мне сначала показать вам пример текстового файла, который я буду использовать для иллюстрации команды grep
.
INDIA IS A BEAUTIFUL COUNTRY OF PEACE LOVING PEOPLE.
india stands on three pillars of legislature, executive and judiciary.
India Is a Beautiful Country Of Peace Loving People.
India cares for the people as it's resource
cartesian coordinates
importance of all th cartesian coordinates.
Following are two empty lines.
use of a bullock cart is a common sight in the village for the agrarian chores.
This is the end of the sample file.
grep
используется с утилитой pipe (|)
grep
может быть реализована вместе с другими командами Linux с использованием конвейеров оболочки. Например, использование cat
команды для отображения содержимого файла, но в то же время конвейеризация вывода с использованием команды grep
для отображения только того содержимого, которое вы хотите видеть. Это станет более понятным, когда мы рассмотрим пример.
Синтаксис:
[command] | grep [string]
Пример:
cat sample.txt | grep legislature
Здесь я использовал команду cat
для отображения некоторых строк из файла ‘sample.txt’. Должны быть отображены только те строки, которые содержат слово ‘legislature’, а остальные строки проигнорированы.
Вывод:
gaurav@ubuntu:~/workspace$ cat sample.txt | grep legislature
india stands on three pillars of legislature, executive and judiciary.
gaurav@ubuntu:~/workspace$
grep
используется без pipe |
grep
может даже использоваться напрямую как отдельная команда без использования утилиты pipe |
.
Синтаксис:
grep [string_to_be_searched] [filename]
Пример:
grep India sample.txt
Вывод:
India Is a Beautiful Country Of Peace Loving People.
India cares for the people as it's resource
Таким образом, я использовал команду grep
напрямую для фильтрации строк, содержащих строку «India» из текстового файла «sample.txt».
Поиск без учета регистра с помощью команды grep
Linux очень осторожен в отношении чувствительности к регистру, когда мы запускаем команды на терминале. Это требует от пользователя быть внимательным к регистру строки, помещенной в команду.
Давайте рассмотрим это на примере.
grep peace sample.txt
В этом случае мы не получим вывод, так как в файле-образце нет слова «peace». У нас есть слово «Peace» с заглавной «P». Слово то же самое, но когда мы используем команду grep
без каких-либо опций, она ищет точное совпадение в файле, игнорируя любые изменения в регистре букв.
Чтобы избежать этой двусмысленности, вы можете просто использовать опцию -i
, которая буквально сообщает команде grep
: «забудь о регистре, в который я поместил строку, и просто найди все совпадающие шаблоны в файле».
Синтаксис:
grep -i [string] [filename]
Пример:
grep -i peace sample.txt
Вывод:
INDIA IS A BEAUTIFUL COUNTRY OF PEACE LOVING PEOPLE.
India Is a Beautiful Country Of Peace Loving People.
Все совпадающие строки отображаются независимо от регистра, в котором находится совпадающая строка.
Рекурсивный поиск с использованием grep
команды
Эта опция -r
выполнит поиск всех файлов в каталоге и всех его подкаталогах, которые соответствуют шаблону строки, указанному пользователем в команде.
Синтаксис:
grep -i -r [string] [file_path]
Пример:
grep -i -r tomcat /home/gaurav/workspace
Строка здесь — ‘tomcat’, и она будет найдена в каталоге workspace. Все подкаталоги и файлы в каталоге ‘workspace’ также будут просканированы на соответствие указанному шаблону строки.
Вывод:
./context_log.policy:// catalina.policy - Security Policy Permissions for Tomcat 7
./context_log.policy:// Note: If tomcat-juli.jar is in ${catalina.base} and not in ${catalina.home},
./context_log.policy:// grant codeBase "file:${catalina.base}/bin/tomcat-juli.jar" {..}
./context_log.policy:grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" {
./context_log.policy: permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.websocket.server";
./context.xml: <!-- Uncomment this to disable session persistence across Tomcat restarts -->
./catalina.properties:# - Tomcat Bootstrap JARs
./catalina.properties:# - Tomcat API JARs
./catalina.properties:# - Tomcat JARs
./catalina.properties:# - Common non-Tomcat JARs
./catalina.properties:org.apache.catalina.startup.TldConfig.jarsToSkip=tomcat7-websocket.jar
./catalina.properties:tomcat.util.buf.StringCache.byte.enabled=true
./catalina.properties:#tomcat.util.buf.StringCache.char.enabled=true
./catalina.properties:#tomcat.util.buf.StringCache.trainThreshold=500000
./catalina.properties:#tomcat.util.buf.StringCache.cacheSize=5000
./server.xml: pathname="conf/tomcat-users.xml" />
./server.xml: <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
./server.xml: <Connector executor="tomcatThreadPool"
./server.xml: every request. The Engine implementation for Tomcat stand alone
./tomcat-users.xml:<tomcat-users>
./tomcat-users.xml: <user username="role1" password="tomcat" roles="role1"/>
./tomcat-users.xml:</tomcat-users>
./web.xml: <!-- loaded into this instance of Tomcat. As each application is -->
./web.xml: <!-- used by Tomcat to support JSP pages. Traditionally, this servlet -->
ПРИМЕЧАНИЕ: При использовании опции -r
с командой grep
нам необходимо указать путь к файлу, а не имя файла.
Поиск только целых слов с помощью команды grep
Во многих случаях вы будете искать одно слово, но в итоге заполните свой терминал совпадающими строками, которые содержат ваше совпадающее слово, но не как отдельное слово. Вы можете увидеть строки, которые содержат некоторые слова, подчасть которых является введенной вами строкой.
Запутались? Не волнуйтесь, все станет гораздо проще понять, как только вы увидите пример.
Пример:
Здесь я хочу выполнить поиск по отдельному слову «cart» и отобразить все строки, соответствующие этому слову в файле «sample.txt».
grep -i cart sample.txt
Вывод:
Cartesian coordinates
importance of all the Cartesian coordinates.
use of a bullock cart is a common sight in the village for the agrarian chores
The cart went missing as the boy left it loose.
В выводе вы можете заметить, что слово «Cartesian» также содержит слово «cart», и, следовательно, строки, содержащие слово «Cartesian», также отображаются, хотя мы не хотим, чтобы они отображались.
Для разрешения этой неоднозначности можно использовать опцию -w
с командой grep
.
Синтаксис:
grep -i -w [string] [filename]
Пример:
grep -i -w cart sample.txt
Вывод:
use of a bullock cart is a common sight in the village for the agrarian chores.
The cart went missing as the boy left it loose.
Теперь, если вы использовали опцию w
, вы получите только те строки, в которых слово «cart» используется целиком.
Обратный поиск с использованием команды grep
Команда grep
также может быть использована в обратном порядке. Мы можем использовать команду grep
наоборот, скрывая совпадающие строки и отображая только те строки, где совпадение не найдено. Вы можете сделать это с помощью опции -v
с командой grep
.
Синтаксис:
grep -i -v [string] [filename]
Пример:
grep -i -v resource sample.txt
Вывод:
INDIA IS A BEAUTIFUL COUNTRY OF PEACE LOVING PEOPLE.
india stands on three pillars of legislature, executive and judiciary.
India Is a Beautiful Country Of Peace Loving People.
cartesian coordinates
importance of all th cartesian coordinates.
use of a bullock cart is a common sight in the village for the agrarian chores.
This is the end of the sample file.
В выходных данных отображаются все остальные строки, кроме строки, содержащей слово «ресурс».
Подсчет вхождений совпадающей строки
Вывод команды grep
обычно очень длинный, если данные в файле обширны. Чем больше совпадений, тем длиннее вывод команды grep
. Linux предоставляет вам опцию, с помощью которой вы можете отобразить количество совпадений.
Синтаксис:
grep -i -c [string] [filename]
Пример:
grep -i -c india sample.txt
Вывод:
gaurav@ubuntu:~/workspace$ grep -i -c india sample.txt
4
gaurav@ubuntu:~/workspace$
Здесь выводом является число, представляющее собой количество появлений слова «Индия» в файле sample.txt.
ПРИМЕЧАНИЕ: Я использовал опцию -i
в каждом примере, чтобы просто обезопасить себя от проблемы чувствительности к регистру. Если вы уверены в регистре слова, которое ищете, то вы можете спокойно пропустить опцию -i
.
Заключение
В этом руководстве мы изучили основные способы использования команды grep
в системах Linux. Мы также научились отображать различный контент, который наилучшим образом соответствует нашим требованиям, не перегружая терминал множеством строк. Команда grep
, несомненно, сэкономит время, если ее использовать для сканирования больших наборов данных.