Перейти к содержанию

4.6 Поиск содержимого внутри файлов (Finding Content within Files)

Ранее в этой главе мы рассмотрели команды оболочки, которые можно использовать для поиска файлов в файловой системе. Однако Linux также предоставляет утилиту grep, с помощью которой можно искать определённое содержимое внутри файла. Утилита grep чрезвычайно полезна; можно с уверенностью сказать, что большинство администраторов Linux используют её ежедневно. С помощью grep можно выполнять поиск по файлу для нахождения определённой текстовой строки. Это бывает удобно, когда нужно найти конкретное сообщение в очень большом файле журнала или отыскать определённую директиву в конфигурационном файле. Более того, grep позволяет искать сразу в нескольких файлах одновременно для нахождения нужного выражения.

Для использования grep вводится команда grep выражение_поиска имя_файла в приглашении командной строки. Например, предположим, что нужно найти в файле /var/log/messages все записи журнала, связанные со службой VNC, работающей в системе Linux. Для этого вводится команда grep vnc /var/log/messages. Утилита grep выведет каждую строку файла, содержащую искомый термин, как показано ниже:

openSUSE:~ # grep vnc /var/log/messages
Feb 1 13:47:25 fs2 xinetd[7134]: Reading included configuration file:
/etc/xinetd.d/vnc [file=/etc/xinetd.d/vnc] [line=15]

Точно так же, если необходимо найти в файле /etc/ntp.conf строку, содержащую директиву server, можно ввести в приглашении командной строки команду grep server /etc/ntp.conf. Это показано в следующем примере:

openSUSE:~ # grep server /etc/ntp.conf
# server 127.127.8.0 mode 5 prefer
server 127.127.1.0
## # rcntp addserver <yourserver>
server bigben.cac.washington.edu iburst
# key (7) for accessing server variables
# controlkey 15          # key (6) for accessing server variables

При работе с grep в командной строке можно использовать следующие параметры:

  • -i — игнорирует регистр при поиске текста;
  • -l — выводит только имена файлов, содержащих совпадающий текст, без отображения самой совпадающей строки;
  • -n — выводит номера совпадающих строк;
  • -r — рекурсивно выполняет поиск по подкаталогам указанного пути;
  • -v — выводит все строки, которые не содержат строку поиска.

Утилита grep отлично работает, когда необходимо найти конкретную текстовую строку внутри файла. Однако иногда возникает потребность в поиске более сложных шаблонов. В такой ситуации вместо grep можно использовать команду egrep.

Примечание

Команда egrep эквивалентна использованию grep -E.

Ключевое преимущество egrep состоит в том, что она умеет выполнять поиск по файлам с использованием расширенных регулярных выражений (extended regular expressions) — строк, состоящих из метасимволов и литералов. Литералы (literals) — обычные буквы (A–Z, a–z) и цифры. Метасимволы (metacharacters) — символы, которые не представляют самих себя, а обозначают другие символы. Они также могут задавать положение символа внутри текстовой строки. Некоторые наиболее часто используемые регулярные выражения перечислены в таблице 4-6. Дополнительные сведения см. на man-странице regex(7).

В дополнение к egrep для поиска содержимого внутри файлов можно использовать утилиту fgrep (fixed-string grep, поиск по фиксированной строке). Утилита fgrep выполняет поиск строк в файлах, соответствующих фиксированной строке. В отличие от egrep, она не выполняет поиск по регулярным выражениям. Вместо этого fgrep использует прямое сравнение строк для нахождения совпадающих строк в тексте. Синтаксис: fgrep шаблон имя_файла. Например, команда fgrep server *.c выполняет поиск строки server во всех файлах текущего каталога с расширением .c.

Примечание

Запуск fgrep эквивалентен запуску grep -F. При использовании регулярных выражений включение текста с подстановочными знаками * или ? (например, *.c) называется шаблоном глоббинга файлов (file globbing pattern).

Давайте потренируемся использовать инструменты поиска Linux в следующем упражнении.

Таблица 4-6. Регулярные выражения

Метасимвол Функция Пример
* Совпадает с любым количеством любых символов Myfile* совпадёт с Myfile1, Myfile2, Myfiles, Myfiles23 и т. д.
. Совпадает с любым одиночным символом Myfile. совпадёт с Myfile1, Myfile2 и Myfiles, но не совпадёт с Myfiles23.
^ Совпадает с выражением, если оно находится в начале строки ^server совпадёт с любым вхождением server, если оно стоит в начале строки.
$ Совпадает с выражением, если оно находится в конце строки server$ совпадёт с любым вхождением server, если оно стоит в конце строки.
\| Совпадает с выражениями по обе стороны от символа конвейера Server\|server совпадёт как с Server, так и с server.
[nnn] Совпадает с любым одним символом из указанных в скобках [xyz] совпадёт с любым из символов x, y или z.
[^nnn] Совпадает с выражением, не содержащим ни одного из указанных символов [^aei] не совпадёт с символами a, e и i.
[n-n] Совпадает с любым одиночным символом из указанного диапазона [1-5] совпадёт с любым числом от 1 до 5.

Упражнение 4-4. Использование grep

В этом упражнении вы будете практиковать использование инструментов поиска Linux. Выполнить упражнение можно в виртуальной машине, поставляемой с этой книгой. Для подготовки правильно настроенной среды запустите снимок 4-1 (snapshot 4-1).

VIDEO Посмотрите видео к упражнению 4-4, в котором показано, как выполнить это задание.

Выполните следующие действия:

  1. Убедитесь, что система Linux запущена и вы вошли в систему как пользователь student. Переключитесь на учётную запись root, введя su - и указав пароль student в приглашении командной строки.
  2. Найдите ссылки на файл inittab в журнале системы, введя grep ifup /var/log/messages. Что можно узнать о ifup из вывода grep?
  3. С помощью egrep найдите сведения о демоне systemd в журнале системы, введя в приглашении командной строки egrep systemd /var/log/messages.
  4. Снова воспользуйтесь egrep для поиска сведений обо всех сетевых интерфейсах Ethernet, установленных в системе, введя egrep enp0s[0-3] /var/log/messages в приглашении командной строки.
  5. Найдите все строки в журнале системы, оканчивающиеся на Enabled, введя egrep Enabled$ /var/log/messages в приглашении командной строки.

Теперь вы — настоящий профессионал по файловым системам! Нужно оставаться скромным, когда знаешь так много!