Grep расшифровывается как global regular expression print (глобальная печать регулярных выражений). Это полезная команда, широко используемая системными инженерами Linux при поиске строки или шаблонов в регулярных файлах и в системе.
В этой статье я собираюсь продемонстрировать использование команды grep на большом количестве примеров. Я протестировал все команды и примеры на машине Debian 10.
Установка команды grep в Debian
У вас должна быть привилегии root.
По умолчанию grep установлен на большинстве систем, включая Debian 10. Если он не установлен, откройте терминал и выполните следующую команду с правами root.
1 | apt-get install grep |
Когда появится запрос на подтверждение, нажмите y, а затем enter с клавиатуры. Дождитесь окончания установки.
Поскольку grep уже был установлен на моей машине, посмотрите на скриншот выше. Давайте проверим ее версию, выполнив следующую команду в терминале.
1 | grep --version |
Она также должна вернуть версию вместе с другими данными.
Использование команды grep
Поиск определенного файла или каталога в системе
Когда вы хотите найти определенный файл в системе, синтаксис команды должен быть следующим.
1 | ls -l <путь поиска каталога> | grep -i "имя файла или каталога" |
Я хочу найти сетевой каталог в /etc/. Полная команда должна выглядеть следующим образом.
1 | ls -l /etc/ | grep -i "network" |
Опция 'i' игнорирует регистр. Поэтому она должна воспринимать network, Network или NETWORK как одно и то же.
Ниже приведен пример вывода.
Предположим, я хочу найти файл "interfaces.d", расположенный по адресу /etc/network/, необходимо выполнить следующую команду.
1 | ls -l /etc/network/ | grep -i "interfaces.d" |
Необходимо заключить слово, которое вы хотите найти, в двойные кавычки, если оно содержит пробелы. Предположим, мы ищем "сетевой демон", приведенная выше команда должна выглядеть следующим образом.
1 | ls -l /etc/network/ | grep -i "interfaces daemon" |
Поиск полного слова с помощью grep
Вы могли заметить, что grep возвращает всевозможные результаты, включающие слово "network", например, networks, networked, networking или abcnetworking и т.д. Если вы хотите ограничить поиск конкретным словом, вам нужно использовать опцию -w следующим образом.
1 | ls -l /etc/ | grep -i -w network |
Ниже приведен пример вывода.
Поиск определенного текста в файле
У нас есть случай, когда у вас есть большой файл и вы хотите найти определенный текст. Синтаксис команды должен быть следующим.
1 | grep - i "текст_для_поиска" "путь_до_файла" |
Предположим, я хочу найти слово "fox" в файле test.txt, который находится в моем текущем каталоге. Выполните следующую команду в терминале.
1 | grep -i "fox" test.txt |
Ниже приведен пример вывода, который возвращает только те строки файла, которые содержат слово "fox".
Выполнение рекурсивного поиска (Поиск в нескольких файлах)
Если вы хотите найти текст в большом количестве файлов и подкаталогов внутри каталога, вы можете выполнить рекурсивный поиск с помощью опции -r.
1 | grep -i -r "fox" |
Ниже приведен пример вывода, который показывает, что слово fox присутствует в обоих файлах test.txt в указанной строке.
Вы также можете указать путь к каталогу, и тогда будет произведен поиск всех файлов в этом каталоге и его подкаталогах.
Предположим, я хочу выполнить рекурсивный поиск текста "interfaces" в каталоге /etc/ и его подкаталогах. Команда должна быть выполнена следующим образом.
1 | grep -i -r interfaces /etc/ |
Ниже приведен пример вывода.
Поиск двух разных слов с помощью одной команды grep
Вы можете искать два разных слова с помощью одной команды egrep (которая является разновидностью grep) следующим образом. Предположим, я хочу найти полные слова fox и lazy в нескольких файлах, используя опцию -r. Для этого нужно выполнить следующую команду в терминале.
1 | egrep -w -r "fox|Dog" |
Ниже приведен пример вывода.
Нумерация строк, соответствующих тексту
Другой полезной опцией является -n, которая нумерует строки, соответствующие тексту. Ниже приведен пример, иллюстрирующий использование опции -n.
1 | grep -i -n "fox" test.txt |
Ниже приведен пример вывода, в котором пронумерованы строки, соответствующие слову "fox".
Инвертирование поиска
Это противоположность тому, что мы сделали выше. Если вы хотите вернуть текст, не содержащий указанного вами слова, вы можете использовать опцию -v.
Ниже приведен пример, демонстрирующий использование опции -v.
1 | grep -v -i "fox" test.txt |
Ниже приведен пример вывода.
Все вышеперечисленные опции (-n и т.д.) также могут быть применены с опцией -v.
Подсчет совпадений
Если вы просто хотите подсчитать количество совпадений с определенным текстом, вы можете использовать опцию -c.
Давайте посчитаем слово "fox" в файле test.txt, расположенном в текущем каталоге. Выполните следующую команду в терминале.
1 | grep -i -c fox test.txt |
Ниже приведен пример вывода после выполнения вышеуказанной команды, который показывает, что слово fox 11 раз встречается в файле test.txt.
Отображение имен файлов, соответствующих определенному тексту
Если вы хотите найти файлы, которые содержат определенное слово, вы можете использовать опцию -l вместе с -r следующим образом. Предположим, что все файлы находятся в вашем текущем каталоге, а конкретное слово, которое вы ищете или сопоставляете - 'fox'.
1 | grep -i -r -l fox |
Ниже приведен пример вывода, который показывает, что слово fox присутствует внутри test.txt.
Отображение только совпадающего текста
По умолчанию grep показывает всю строку, которая соответствует нужному тексту или слову. Если вы хотите, чтобы grep показывал только совпавшие слова, вы можете использовать опцию -o следующим образом.
1 | grep -i -o fox test.txt |
Ниже приведен пример вывода.
Отображение строк, которые начинаются с определенного слова (слов)
Если вы хотите получить все строки, которые начинаются с определенного слова (слов), вы можете использовать оператор ^ следующим образом.
Предположим, вы хотите получить все строки, которые начинаются с "Cow", а файл test.txt находится в текущем каталоге.
Выполните следующую команду в терминале.
1 | grep -i "^Cow" test.txt |
Ниже приведен пример вывода.
Отображение строк, которые заканчиваются определенным словом (словами)
Если вы хотите вернуть все те строки из файла, которые заканчиваются определенным словом (словами), вы можете использовать оператор $ следующим образом.
Для примера, отобразим все строки, которые заканчиваются на woods.
Выполните следующую команду в терминале.
1 | grep -i "woods$" test.txt |
Ниже приведен пример вывода.
Заключение
В качестве примера приведено большинство опций grep, которые чаще всего используются и могут понадобиться вам в повседневной работе.