Команда Linux grep используется в качестве метода для фильтрации ввода. GREP означает «Принтер глобальных регулярных выражений», поэтому для его эффективного использования необходимо иметь некоторые знания о регулярных выражениях .
В этой статье вы узнаете несколько примеров, которые помогут вам понять команду grep.
Как искать строку в файле с помощью GREP
Представьте, что у вас есть текстовый файл с названием books со следующими названиями детских книг:
- Робин Гуд
- Красная Шапочка
- Питер Пен
- Златовласка и три медведя
- Белоснежка и семь гномов
- Pinnochio
- Кот в мешке
- Три маленьких поросенка
- Граффало
- Чарли и шоколадная фабрика
Чтобы найти все книги со словом «The» в названии, вы должны использовать следующий синтаксис:
grep Книги
Будут возвращены следующие результаты:
Златовласка и три медведя
Белоснежка и семь гномов
Кот в шляпе
Три поросенка
Грифило
Чарли и шоколадная фабрика
В каждом случае слово «The» будет подсвечено.
В поиске учитывается регистр, поэтому, если бы у одного из заголовков было «the» вместо «The», он не был бы возвращен.
Чтобы игнорировать регистр, вы можете добавить следующий параметр:
grep the books - игнорировать
Вы также можете использовать ключ -i следующим образом:
grep -i книги
Поиск строки в файле с использованием регулярных выражений
Команда grep очень мощная. Вы можете использовать множество методов сопоставления с образцом для фильтрации результатов.
В этом примере мы покажем вам, как искать строку в файле с использованием подстановочных знаков .
Представьте, что у вас есть файл мест с такими шотландскими названиями мест:
Aberdeen
Абериствит
Aberlour
Inverurie
инвернесс
Ньюбергского
новый олень
новый малорослая
глазго
эдинбург
Если вы хотите найти все места с инверсией в названии, используйте следующий синтаксис:
grep инверсия * местами
Символ звездочки (*) работает не так, как в обычном Bash. В контексте grep, который имеет дело с регулярными выражениями, звездочка ведет себя по-разному. Вместо сопоставления с любыми символами или без них, например, Bash, он соответствует введенному шаблону плюс любые последующие повторения этого шаблона или нет.
В приведенном выше примере это соответствует:
инверсури
инверсия
потому что они оба содержат шаблон «инверсия», введенный плюс ноль дополнительных повторений этого шаблона. Чтобы увидеть это более четко, добавьте:
repeatinverinverinver
к списку. Нет, в этом нет особого смысла, но он продемонстрирует, как работает звездочка. Попробуйте запустить команду еще раз.
grep инверсия * местами
Вы видите новую линию? Это не сработает в 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
- everydaylinuxuser.com
- google.co.uk
- google.au
- direct.gov.uk
- fakesite.lifewire1com.com
Чтобы найти все URL-адреса lifewire.com, вы можете просто выполнить поиск, используя следующий синтаксис:
grep .com доменные имена
Вышеприведенная команда выпадет, если список будет содержать следующее имя:
everydaylinuxuser.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 $ команды
Вышеуказанная команда вернется в «Манчестер Юнайтед» и «Ньюкасл Юнайтед», но не в «ФК Юнайтед» из Манчестера.
Подсчет количества совпадений с использованием grep
Если вы не хотите возвращать фактические строки, которые соответствуют шаблону, используя grep, но вы просто хотите знать, сколько их, вы можете использовать следующий синтаксис:
grep -c pattern inputfile
Если шаблон был сопоставлен дважды, будет возвращено число 2.
Найти все термины, которые не совпадают, используя grep
Представьте, что у вас есть список географических названий со следующими странами:
- Абердин Шотландия
- Глазго Шотландия
- Ливерпуль Англия
- Colwyn Bay
- Лондон, Англия
Возможно, вы заметили, что в Колвин-Бей нет страны, с которой он связан.
Для поиска всех мест в стране вы можете использовать следующий синтаксис:
grep land $ мест
Результаты возвращаются во всех местах, кроме Колвин-Бей.
Это, очевидно, работает только для мест, которые заканчиваются на суше (вряд ли научно).
Вы можете инвертировать выделение, используя следующий синтаксис:
grep -v земля $ мест
Это найдет все места, которые не заканчиваются землей.
Как найти пустые строки в файлах, используя grep
Представьте, что у вас есть входной файл, который используется сторонним приложением, которое прекращает чтение файла, когда находит пустую строку следующим образом:
- Абердин, Шотландия
- Инвернесс Шотландия
- ливерпуль англия
- Колвин Бэй Уэльс
Когда приложение попадает в строку после «Ливерпуля», оно прекращает чтение, что означает, что отсек «Колвин» полностью отсутствует
Вы можете использовать grep для поиска пустых строк со следующим синтаксисом:
grep ^ $ мест
К сожалению, это не особенно полезно, потому что оно просто возвращает пустые строки.
Вы можете, конечно, получить счетчик количества пустых строк в качестве проверки, чтобы убедиться, что файл действителен следующим образом:
grep -c ^ $ мест
Однако было бы более полезно узнать номера строк, которые имеют пустую строку, чтобы вы могли их заменить. Вы можете сделать это с помощью следующей команды:
grep -n ^ $ мест
Как искать строки заглавных или строчных букв, используя grep
Используя grep, вы можете определить, какие строки в файле имеют заглавные буквы, используя следующий синтаксис:
grep '[AZ]' имя файла
Квадратные скобки [] позволяют определить диапазон символов. В приведенном выше примере он соответствует любому символу между A и Z.
Поэтому для сопоставления строчных символов вы можете использовать следующий синтаксис:
grep '[az]' имя файла
Если вы хотите сопоставлять только буквы, а не цифры или другие символы, вы можете использовать следующий синтаксис:
grep '[a-zA-Z]' имя файла
Вы можете сделать то же самое с числами следующим образом:
grep '[0-9]' filename
Поиск повторяющихся шаблонов с использованием grep
Вы можете использовать фигурные скобки {} для поиска повторяющегося шаблона.
Представьте, что у вас есть файл с номерами телефонов:
- 055-1234
- 055-4567
- 555-1545
- 444-0167
- 444-0854
- 4549-2234
- x44-1234
Вы знаете, что первая часть номера должна состоять из трех цифр, и вы хотите найти линии, которые не соответствуют этому шаблону.
From the previous example, you know that [0-9] returns all numbers in a file.
In this instance, we want the lines that start with three numbers followed by a hyphen (-). You can do that with the following syntax:
grep "^[0-9][0-9][0-9]-" numbers
As we know from previous examples the carat (^) means that the line must begin with the following pattern.
The [0-9] will search for any number between 0 and 9. As this is included three times it matches 3 numbers. Finally, there is a hyphen to denote that a hyphen must succeed the three numbers.
By using the curly brackets you can make the search smaller as follows:
grep "^[0-9]\{3\}-" numbers
The slash escapes the { bracket so that it works as part of the regular expression but in essence what this is saying is [0-9]{3} which means any number between 0 and 9 three times.
The curly brackets can also be used as follows:
{5,10}
{5,}
The {5,10} means that the character being searched for must be repeated at least 5 times but no more than 10 whereas the {5,} means that the character must be repeated at least 5 times but it can be more than that.
Using the Output From Other Commands Using grep
Thus far we have looked at pattern matching within individual files but grep can use the output from other commands as the input for pattern matching.
A great example of this is using the ps command which lists active processes.
For example, run the following command:
ps -ef
All of the running processes on your system will be displayed.
You can use grep to search for a particular running process as follows:
ps -ef | grep firefox
Summary
The grep command is a fundamental Linux command and it is one that is well worth learning as it will make your life much easier when searching for files and processes when using the terminal.