Linux

Пример использования команды Linux grep

Скриншот руководства по Linux grep Command

Команда Linux grep используется в качестве метода для фильтрации ввода. GREP означает «Принтер глобальных регулярных выражений», поэтому для его эффективного использования необходимо иметь некоторые знания о регулярных выражениях .

В этой статье вы узнаете несколько примеров, которые помогут вам понять команду grep.

Как искать строку в файле с помощью GREP

Скриншот руководства по Linux grep Command

Представьте, что у вас есть текстовый файл с названием 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 может быть только один подстановочный знак, обозначаемый одним периодом.

Подстановочный знак периода полезен, но он может вызвать проблемы, если он есть в тексте, который вы ищете.

Например, посмотрите на этот список доменных имен

Чтобы найти все 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.

Похожие посты
Linux

8 лучших окружений рабочего стола Linux

AndroidIphone и ipadLinuxWindows

Окончательное руководство по включению темного режима везде

LinuxКак сделать

Что такое Swappiness в Linux? (и как это изменить)

LinuxКак сделать

Как использовать команду ls для вывода списка файлов и каталогов в Linux