Пример использования команды grep в Linux
Команда Linux grep используется как метод фильтрации ввода. GREP расшифровывается как Global Regular Expression Printer, и поэтому для его эффективного использования вы должны иметь некоторые знания о регулярных выражениях.
В этой статье вы узнаете ряд примеров, которые помогут вам понять команду grep.
Как искать строку в файле с помощью GREP
Представьте, что у вас есть текстовый файл с названием книги со следующими названиями детских книг:
- Робин Гуд
- Красная Шапочка
- Питер Пэн
- Златовласка и три медведя
- Белоснежка и семь гномов
- Pinnochio
- Кот в шляпе
- Три маленьких поросенка
- Груффало
- Чарли и шоколадная фабрика
Чтобы найти все книги, в названии которых есть слово «The», используйте следующий синтаксис:
grep Книги.
Будут возвращены следующие результаты:
Златовласка и три медведя
Белоснежка и семь гномов
Кот в шляпе
Три маленьких поросенка
Груффало
Чарли и шоколадная фабрика.
В каждом случае слово «The» будет выделено.
Поиск чувствителен к регистру, поэтому, если бы в одном из заголовков вместо «The» было «The», оно не было бы возвращено.
Чтобы игнорировать регистр, вы можете добавить следующий переключатель:
grep the books --ignore-case.
Вы также можете использовать переключатель -i следующим образом:
grep -i книги.
Поиск строки в файле с помощью регулярных выражений
Команда grep очень мощная. Вы можете использовать множество методов сопоставления с образцом для фильтрации результатов.
В этом примере мы покажем вам, как искать строку в файле с помощью подстановочных знаков.
Представьте, что у вас есть файл с названием «Места» со следующими шотландскими географическими названиями:
Абердин
Aberystwyth
Aberlour
инверюри
инверсия
Ньюбург
новый олень
New Galloway
Глазго
Эдинбург.
Если вы хотите найти все места с инвертированным именем, используйте следующий синтаксис:
grep Inver * Места.
Символ звездочки (*) работает не так, как в обычном Bash. В контексте grep, который работает с регулярными выражениями, звездочка ведет себя иначе. Вместо того, чтобы сопоставлять какие-либо символы или не совпадать без них, как в Bash, он сопоставляет введенный шаблон плюс любые или никакие последующие повторения этого шаблона.
В приведенном выше примере это соответствует:
инверюри
инверсия.
потому что они оба содержат шаблон "инвертированный" в том виде, в каком он был введен, плюс ноль дополнительных повторений этого шаблона. Чтобы еще раз увидеть это более ясно, добавьте:
репетинверинверинвер.
к списку. Нет, это не имеет особого смысла, но продемонстрирует, как работает звездочка. Попробуйте запустить команду еще раз.
grep Inver * Места.
Вы видите новую строку? В Bash это не сработает, но здесь работает.
Чтобы сделать ситуацию еще более странной, запустите команду без звездочки.
grep в обратных местах.
Результаты такие же. По умолчанию grep будет искать шаблон в любом месте строки текста. Он также не различает, сколько раз он появляется.
Другой подстановочный знак, который вы можете использовать, - это точка (.). Вы можете использовать это, чтобы сопоставить одну букву.
grep Inver.r размещает.
Приведенная выше команда найдет места, называемые инвертируем и инверарием, но не найдет инвертируемость, потому что между двумя r может быть только один подстановочный знак, обозначенный одной точкой.
Подстановочный знак точки полезен, но он может вызвать проблемы, если он у вас есть как часть искомого текста.
Например, посмотрите на этот список доменных имен.
- linux.lifewire.com
- pcsupport.lifewire.com
- mp3.lifewire.com
- minecraft.lifewire.com
- androidgames.lifewire.com
- netforbeginners.lifewire.com
- dailylinuxuser.com
- google.co.uk
- google.au
- direct.gov.uk
- fakesite.lifewire1com.com
Чтобы найти все URL-адреса lifewire.com, вы можете просто выполнить поиск, используя следующий синтаксис:
grep .com доменные имена.
Вышеупомянутая команда упала бы, если бы список содержал в себе следующее имя:
dailylinuxuser.com.
Поэтому вы можете попробовать следующий синтаксис:
grep lifewire.com доменные имена.
Это будет работать нормально, если не будет домена со следующим именем:
fakesite.lifewire1com.com.
Чтобы действительно найти термин lifewire.com, вам нужно избежать точки следующим образом:
grep lifewire \\. com доменные имена.
Последний подстановочный знак, который вам нужно показать, - это вопросительный знак, обозначающий ноль или один символ.
Например:
grep -E ?ber топонимы.
Вышеупомянутая команда вернула бы aberdeen, aberystwyth или даже berwick, если бы они были в списке. Обратите внимание на дополнительный флаг '-E'. Grep не распознает? символ без включения расширенной поддержки регулярных выражений.
Поиск строк в начале и конце строки с помощью grep
Карат (^) и символ доллара ($) позволяют искать шаблоны в начале и в конце строк.
Представьте, что у вас есть файл с названием football со следующими названиями команд:
- Блэкпул
- Ливерпуль
- Манчестер
- Лестер Сити
- Манчестер Юнайтед
- Ньюкасл Юнайтед
- ФК Юнайтед Манчестер
Если вы хотите найти все команды, которые начали с Манчестера, вы должны использовать следующий синтаксис:
grep ^ Манчестерские команды.
Вышеупомянутая команда вернет "Манчестер Сити" и "Манчестер Юнайтед", но не "Манчестер Юнайтед".
Кроме того, вы можете найти все команды, оканчивающиеся на United, используя следующий синтаксис:
grep United $ team.
Вышеупомянутая команда вернется в «Манчестер Юнайтед» и «Ньюкасл Юнайтед», но не в «Манчестер Юнайтед».
Подсчет количества совпадений с помощью grep
Если вы не хотите возвращать фактические строки, соответствующие шаблону, используя grep, но просто хотите знать, сколько их существует, вы можете использовать следующий синтаксис:
grep -c шаблон входной файл.
Если образец был сопоставлен дважды, то будет возвращено число 2.
Поиск всех несовпадающих терминов с помощью grep
Представьте, что у вас есть список географических названий со следующими странами:
- Aberdeen Scotland
- Глазго Шотландия
- Ливерпуль Англия
- Колвин-Бэй
- Лондон, Англия
Возможно, вы заметили, что у Колвин-Бей нет страны, связанной с ним.
Чтобы найти все места со страной, вы можете использовать следующий синтаксис:
grep land $ places.
Результаты будут возвращены во всех местах, кроме залива Колвин.
Очевидно, это работает только для мест, которые заканчиваются на суше (вряд ли с научной точки зрения).
Вы можете инвертировать выделение, используя следующий синтаксис:
grep -v land $ places.
Это найдет все места, которые не заканчивались сушей.
Как найти пустые строки в файлах с помощью grep
Представьте, что у вас есть входной файл, который используется сторонним приложением, которое прекращает чтение файла, когда находит пустую строку, как показано ниже:
- Абердин Шотландия
- Инвернесс Шотландия
- ливерпуль англия
- Colwyn Bay Wales
Когда приложение дойдет до строки после Ливерпуля, оно перестанет читать, что означает, что залив Колвин полностью пропущен.
Вы можете использовать grep для поиска пустых строк со следующим синтаксисом:
grep ^ $ мест.
Это не особенно полезно, потому что возвращает пустые строки.
Конечно, вы можете подсчитать количество пустых строк в качестве проверки, чтобы убедиться, что файл действителен следующим образом:
grep -c ^ $ мест.
Однако было бы более полезно знать номера строк, в которых есть пустая строка, чтобы вы могли их заменить. Вы можете сделать это с помощью следующей команды:
grep -n ^ $ мест.
Как искать строки символов в верхнем или нижнем регистре с помощью grep
Используя grep, вы можете определить, какие строки в файле содержат символы верхнего регистра, используя следующий синтаксис:
grep '[A-Z]' имя файла.
Квадратные скобки [] позволяют определить диапазон символов. В приведенном выше примере он соответствует любому символу между A и Z.
Поэтому для сопоставления символов нижнего регистра вы можете использовать следующий синтаксис:
grep '[a-z]' имя файла.
Если вы хотите сопоставить только буквы, а не цифры или другие символы, вы можете использовать следующий синтаксис:
grep '[a-zA-Z]' имя файла.
Вы можете сделать то же самое с числами следующим образом:
grep '[0-9]' имя файла.
Поиск повторяющихся шаблонов с помощью grep
Вы можете использовать фигурные скобки {} для поиска повторяющегося шаблона.
Представьте, что у вас есть файл со следующими номерами телефонов:
- 055-1234
- 055-4567
- 555-1545
- 444-0167
- 444-0854
- 4549-2234
- х44-1234
Вы знаете, что первая часть числа должна состоять из трех цифр, и вы хотите найти строки, которые не соответствуют этому шаблону.
Из предыдущего примера вы знаете, что [0-9] возвращает все числа в файле.
В этом случае нам нужны строки, начинающиеся с трех чисел, за которыми следует дефис (-). Вы можете сделать это с помощью следующего синтаксиса:
grep "^ [0-9] [0-9] [0-9] -" числа.
Как мы знаем из предыдущих примеров, карат (^) означает, что линия должна начинаться со следующего шаблона.
[0-9] будет искать любое число от 0 до 9. Поскольку это включено три раза, оно соответствует 3 числам. Наконец, есть дефис, обозначающий, что после трех чисел должен стоять дефис.
Используя фигурные скобки, вы можете уменьшить размер поиска следующим образом:
grep "^ [0-9] \ {3 \} -" числа.
Косая черта экранирует скобку {, так что она работает как часть регулярного выражения, но по сути это означает [0-9] {3}, что означает любое число от 0 до 9 три раза.
Фигурные скобки также можно использовать следующим образом:
{5,10}
{5,}
{5,10} означает, что искомый символ должен быть повторен не менее 5 раз, но не более 10, тогда как {5,} означает, что символ должен повторяться не менее 5 раз, но может быть больше, чем что.
Использование вывода других команд с помощью grep
До сих пор мы рассматривали сопоставление с образцом в отдельных файлах, но grep может использовать вывод других команд в качестве входных данных для сопоставления с образцом.
Прекрасным примером этого является использование команды ps, которая выводит список активных процессов.
Например, выполните следующую команду:
ps -ef.
Будут отображены все запущенные процессы в вашей системе.
Вы можете использовать grep для поиска конкретного запущенного процесса следующим образом:
ps -ef | grep firefox.
Резюме
Команда grep является фундаментальной Linux, и ее стоит изучить, поскольку она значительно упростит вам жизнь при поиске файлов и процессов при использовании терминала.