Вы когда-нибудь сталкивались с задачей поиска определенной строки или шаблона в файле, но не знаете, с чего начать поиск? Что ж, вот вам на помощь grep!
grep — это мощная программа для поиска шаблонов файлов, которая есть в каждом дистрибутиве Linux. Если по какой-либо причине он не установлен в вашей системе, вы можете легко установить его через диспетчер пакетов, как показано ниже.
$ sudo apt install grep [On Debian, Ubuntu and Mint] $ sudo yum install grep [On RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux] $ sudo emerge -a sys-apps/grep [On Gentoo Linux] $ sudo apk add grep [On Alpine Linux] $ sudo pacman -S grep [On Arch Linux] $ sudo zypper install grep [On OpenSUSE]
Я обнаружил, что самый простой способ намочить ноги с помощью команды grep — это просто погрузиться в нее и использовать несколько реальных примеров.
1. Поиск и поиск файлов в Linux
Допустим, вы только что установили новую копию новой Ubuntu на свой компьютер и собираетесь попробовать написать скрипт на Python.
Вы рыскали в Интернете в поисках руководств, но видите, что используются две разные версии Python, и вы не знаете, какая версия Python установлена в Ubuntu установщиком и установлены ли какие-либо модули.
Просто запустите следующую команду dpkg с grep, как показано ниже:
# dpkg -l | grep -i python
Сначала мы запустили dpkg –l, в котором перечислены установленные пакеты *.deb в вашей системе. Во-вторых, мы передали этот вывод в grep –i python, который просто говорит: «перейдите в grep, отфильтруйте и верните все, что содержит «python» в нем».
Опция –i предназначена для игнорирования регистра, так как grep чувствителен к регистру. Использование параметра -i — это хорошая привычка, если, конечно, вы не пытаетесь закрепить более конкретный поиск.
2. Поиск и фильтрация файлов в Linux
Grep также можно использовать для поиска и фильтрации в отдельных файлах или нескольких файлах. Возьмем этот сценарий:
У вас возникли проблемы с вашим веб-сервером Apache, и вы обратились на один из множества замечательных форумов в сети с просьбой о помощи.
Добрая душа, которая отвечает вам, попросила вас опубликовать содержимое вашего файла /etc/apache2/apache2.conf. Разве не было бы легче для вас, для парня, который вам помогает, и для всех, кто читает это, если бы вы могли удалить все закомментированные строки? Ну, ты можешь! Просто запустите это:
# grep -v ^# /etc/apache2/apache2.conf | grep .
Параметр –v указывает grep инвертировать вывод, то есть вместо вывода совпадающих строк сделать наоборот и вывести все строки, не соответствующие выражению, в данном случае строки с комментариями #.
Обратите внимание, что мы также использовали grep . в конце, чтобы скрыть вывод всех пустых строк. Таким образом, мы видим только настройки конфигурации в нашем терминале.
3. Найти все файлы .mp3 в Linux
grep может быть очень полезен для фильтрации из stdout. Например, предположим, что у вас есть целая папка с музыкальными файлами в разных форматах.
Вы хотите найти все файлы *.mp3 от исполнителя JayZ, но вам не нужны никакие ремикшированные треки. Использование команды find с парой каналов grep сделает свое дело:
# find . –name “*.mp3” | grep –i JayZ | grep –vi “remix”
В этом примере мы используем find для вывода всех файлов с расширением *.mp3, передаем его в grep –i для фильтрации и печати всех файлов с именем «JayZ», а затем еще один канал в grep –vi, который фильтрует out и не выводит все имена файлов со строкой (во всяком случае) «remix».
4. Отображение количества строк до или после строки поиска
Еще пара опций — это переключатели -A и -B, которые отображают совпадающую строку и количество строк, которые идут до или после строки поиска.
В то время как справочная страница дает более подробное объяснение, мне кажется, что проще всего запомнить параметры как –A = после и –B = до:
# ifconfig | grep -A 4 inet # ifconfig | grep -B 2 UP
5. Печатает количество строк вокруг совпадения
Опция –C команды grep аналогична, но вместо того, чтобы печатать строки, идущие до или после строки, она печатает строки в любом направлении:
6. Подсчитайте количество совпадений
Подобно передаче строки grep в счетчик слов (команда wc), встроенная опция grep может сделать то же самое для вас:
# ifconfig | grep -c inet6
7. Поиск файлов по заданной строке в Linux
Опция –n для grep очень полезна при отладке файлов во время ошибок компиляции. Он отображает номер строки в файле заданной строки поиска:
# grep -n "main" setup.py
8. Рекурсивный поиск строки во всех каталогах
Если вы хотите искать строку в текущем каталоге вместе со всеми подкаталогами, вы можете указать параметр –r для рекурсивного поиска:
# grep -r “function” *
9. Поиск всего паттерна
Передача параметра -w в команду grep ищет весь шаблон, содержащийся в строке. Например, используя:
# ifconfig | grep -w "RUNNING"
Выведет строку, содержащую шаблон в кавычках. С другой стороны, если вы попробуете:
# ifconfig | grep -w "RUN"
Ничего не будет возвращено, так как мы ищем не шаблон, а целое слово.
10. Поиск строки в сжатых файлах
Отдельного упоминания заслуживают производные от grep. Первый — это zgrep, который, как и zcat, предназначен для использования с файлами, сжатыми gzip. Он принимает те же параметры, что и grep, и используется таким же образом:
# zgrep -i error /var/log/syslog.2.gz
11. Соответствие регулярным выражениям в файлах
Команда egrep — еще одна производная от «Расширенное глобальное регулярное выражение». Он распознает дополнительные метасимволы выражений, такие как + ? | а также ().
egrep очень полезен для поиска исходных файлов и других фрагментов кода, если в этом возникнет необходимость. Его можно вызвать из обычного grep, указав параметр –E.
# grep -E
12. Поиск фиксированной строки шаблона
fgrep ищет в файле или списке файлов фиксированную строку шаблона. Это то же самое, что и grep -F. Обычный способ использования fgrep — передать ему файл шаблонов:
# fgrep –f file_full_of_patterns.txt file_to_search.txt
Это всего лишь отправная точка с grep, но, как вы, вероятно, видите, она бесценна для множества целей. Помимо реализованных нами простых однострочных команд, для начала можно использовать grep для написания мощных заданий cron и надежных сценариев оболочки.