- Автор темы
- Администратор
- Модер.
- Команда форума
- #1
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 и изменим вывод, чтобы получить нужные результаты. Чтобы найти строку в файле, выполните следующую команду:
Или команду:
Например, давайте найдем строку “Linux” в нашем файле:
Получаем следующий вывод:
Как видите, grep не только нашла и сопоставила строку “Linux”, но и вывела строки, в которых она встречается. Если файл находится в другой директории, то обязательно укажите путь к нему, например:
Вывод будет следующим:
Давайте для примера найдем строку “linux” в текущем каталоге и всех его подкаталогах:
Вывод команды будет следующим:
В приведенном выше примере результаты поиска дали нам то, что мы искали, потому что строка “Linux” была написана с заглавной буквы. Теперь давайте попробуем найти строку в нижнем регистре.
Мы не получим никакого вывода. Это связано с тем, что при поиске команде не удается найти и сопоставить строку “linux”, поскольку первая буква в ней строчная. Чтобы игнорировать регистр символов, выполните приведенную ниже команду с флагом -i:
Получим следующий вывод:
Флаг -i обычно выводит строки независимо от регистра.
Для подсчета общего количества строк, в которых встречается или содержится строковый шаблон, выполните следующую команду:
Вывод будет следующим:
Добавьте флаг -v, чтобы инвертировать вывод Grep. Опция -v выводит все строки, которые не содержат выражения или не соответствуют ему. По сути этот флаг позволяет инвертировать вывод grep, то есть вместо вывода совпадающих строк сделать наоборот и вывести строки, которые не соответствуют выражению. Вернемся к нашему файлу и выведем номера строк. Нажмите ESC в редакторе Vim, введите двоеточие, а затем команду:
Затем нажмите Enter, и вы получите вывод:
Чтобы вывести строки, в которых нет строки “Linux”, выполните команду:
Получаем следующий вывод:
Как видите, grep вывел строки, не содержащие паттерн поиска.
С помощью опции -n можно пронумеровать строки, в которых команда обнаружила искомый шаблон:
Вывод будет следующим:
Флаг -w будет искать строку, которая точно совпадает с шаблоном:
Получаем следующий вывод:
Однако, если вы попробуете выполнить команду:
То никаких результатов не будет, потому что мы ищем не шаблон, а точное слово!
Команду grep можно использовать с другими командами, это делается посредством каналов (или пайплайнов). Например, если нужно узнать, установлен ли определенный пакет в системе Ubuntu, выполните команду:
Чтобы узнать, установлен ли OpenSSH в системе, выполните команду dpkg -l в связке с grep, как показано ниже:
Вы получите:
При помощи флагов -A или -B можно вывести конкретное количество строк, которые стоят до или идут после искомого шаблона. Флаг -A выводит строки, которые идут после строки поиска, -B — строки до. Например, выполним команду:
Она выводит искомую строку плюс 4 строки текста после строки ens в команде ifconfig. Вывод будет следующим:
В приведенном ниже примере флаг -B выводит искомую строку плюс 3 строки перед строкой ether в команде ifconfig.
Получаем вывод:
Термин REGEX (REGular EXpression) — это последовательность символов, которая используется для сопоставления шаблона. Ниже приведены несколько примеров:
Чтобы вывести строки, которые начинаются с определенного символа, выполните команду:
К примеру, чтобы вывести строки, начинающиеся с буквы “d” в файле welcome.txt, нам нужно выполнить команду:
Вывод будет следующим:
Для вывода строк, которые заканчиваются буквой “x”, выполните:
Получаем вывод:
Если вы хотите узнать больше о команде 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
Команда вернет вам примерно следующее: