Основные команды Linux: как работает grep

Grep (сокращение от “global regular expression print”) — команда Linux/UNIX, с помощью которой выполняется поиск строк и сопоставление текстовых файлов с регулярными выражениями. Она предустановлена в каждом дистрибутиве Linux. В этом гайде мы рассмотрим работу команды grep на нескольких примерах.

При помощи команды Grep можно выполнить поиск регулярного выражения или строки в текстовом файле. Чтобы продемонстрировать это, создадим текстовый файл welcome.txt и добавим в него следующую информацию:

Welcome to Linux !
Linux is a free and opensource Operating system that is mostly used by
developers and in production servers for hosting crucial components such as web
and database servers. Linux has also made a name for itself in PCs.
Beginners looking to experiment with Linux can get started with friendlier linux
distributions such as Ubuntu, Mint, Fedora and Elementary OS.

Теперь выполним несколько команд grep и изменим вывод, чтобы получить нужные результаты. Чтобы найти строку в файле, выполните следующую команду:

$ grep "string" file name

Или команду: 

$ filename grep "string"

Например, давайте найдем строку “Linux” в нашем файле:

$ grep "Linux" welcome.txt

Получаем следующий вывод:

Как видите, grep не только нашла и сопоставила строку “Linux”, но и вывела строки, в которых она встречается. Если файл находится в другой директории, то обязательно укажите путь к нему, например:

$ grep "string" /path/to/file

Цветной вывод Grep 

Если вам нужен цветной вывод, вы можете получить его с помощью опции –color. Например:

$ grep --color "free and opensource" welcome.txt

Вывод будет следующим:

Рекурсивный поиск строки во всех директориях

Если вы хотите найти строку в текущем каталоге и всех его подкаталогах, выполните поиск с флагом -r:

$ grep -r "string-name" *

Давайте для примера найдем строку “linux” в текущем каталоге и всех его подкаталогах:

$ grep -r "linux" *

Вывод команды будет следующим:

Отключение чувствительности к регистру

В приведенном выше примере результаты поиска дали нам то, что мы искали, потому что строка “Linux” была написана с заглавной буквы. Теперь давайте попробуем найти строку в нижнем регистре.

$ grep "linux" file name

Мы не получим никакого вывода. Это связано с тем, что при поиске команде не удается найти и сопоставить строку “linux”, поскольку первая буква в ней строчная. Чтобы игнорировать регистр символов, выполните приведенную ниже команду с флагом -i:

$ grep -i "linux" welcome.txt

Получим следующий вывод:

Флаг -i обычно выводит строки независимо от регистра.

Подсчет повторяющихся строк

Для подсчета общего количества строк, в которых встречается или содержится строковый шаблон, выполните следующую команду:

$ grep -c "Linux" welcome.txt

Вывод будет следующим:

Инвертирование вывода

Добавьте флаг -v, чтобы инвертировать вывод Grep. Опция -v выводит все строки, которые не содержат выражения или не соответствуют ему. По сути этот флаг позволяет инвертировать вывод grep, то есть вместо вывода совпадающих строк сделать наоборот и вывести строки, которые не соответствуют выражению. Вернемся к нашему файлу и выведем номера строк. Нажмите ESC в редакторе Vim, введите двоеточие, а затем команду:

set nu

Затем нажмите Enter, и вы получите вывод:

Чтобы вывести строки, в которых нет строки “Linux”, выполните команду:

$ grep -v "Linux" welcome.txt

Получаем следующий вывод:

Как видите, grep вывел строки, не содержащие паттерн поиска.

Нумерация искомых строк

С помощью опции -n можно пронумеровать строки, в которых команда обнаружила искомый шаблон:

$ grep -n "Linux" welcome.txt

Вывод будет следующим:

Точный поиск

Флаг -w будет искать строку, которая точно совпадает с шаблоном:

$ grep -w "opensource" welcome.txt

Получаем следующий вывод:

Однако, если вы попробуете выполнить команду:

$ grep -w "open" welcome.txt

То никаких результатов не будет, потому что мы ищем не шаблон, а точное слово!

Пайплайны и grep

Команду grep можно использовать с другими командами, это делается посредством каналов (или пайплайнов). Например, если нужно узнать, установлен ли определенный пакет в системе Ubuntu, выполните команду:

$ dpkg -L | grep "package-name"

Чтобы узнать, установлен ли OpenSSH в системе, выполните команду dpkg -l в связке с grep, как показано ниже:

$ dpkg -L | grep -i "openssh"

Вы получите:

Вывод строк до или после шаблона

При помощи флагов -A или -B можно вывести конкретное количество строк, которые стоят до или идут после искомого шаблона. Флаг -A выводит строки, которые идут после строки поиска, -B — строки до. Например, выполним команду:

$ ifconfig | grep -A 4 ens3

Она выводит искомую строку плюс 4 строки текста после строки ens в команде ifconfig. Вывод будет следующим:

В приведенном ниже примере флаг -B выводит искомую строку плюс 3 строки перед строкой ether в команде ifconfig.

$ ifconfig | grep -B 4 ether

Получаем вывод:

grep и регулярные выражения (REGEX)

Термин REGEX (REGular EXpression) — это последовательность символов, которая используется для сопоставления шаблона. Ниже приведены несколько примеров:

  • ^ — сопоставляет символы в начале строки
  • $ — сопоставляет символы в конце строки
  • “.” — ищет любой символ
  • [a-z] — сопоставляет любые символы от A до Z
  • [^ ..] — сопоставляет всё, кроме символов в скобках

Читайте также: Введение в регулярные выражения

Чтобы вывести строки, которые начинаются с определенного символа, выполните команду:

grep ^character file_name

К примеру, чтобы вывести строки, начинающиеся с буквы “d” в файле welcome.txt, нам нужно выполнить команду:

$ grep ^d welcome.txt

Вывод будет следующим:

Для вывода строк, которые заканчиваются буквой “x”, выполните:

$ grep x$ welcome.txt

Получаем вывод:

Другие опции Grep

Если вы хотите узнать больше о команде Grep, запустите приведенную ниже команду, чтобы просмотреть другие флаги или опции, которые можно использовать вместе с этой командой.

$ grep --help

Команда вернет вам примерно следующее:

Tags: , ,

Добавить комментарий