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, в котором показано, как выполнить это задание.
Выполните следующие действия:
- Убедитесь, что система Linux запущена и вы вошли в систему как пользователь
student. Переключитесь на учётную записьroot, введяsu -и указав парольstudentв приглашении командной строки. - Найдите ссылки на файл
inittabв журнале системы, введяgrep ifup /var/log/messages. Что можно узнать оifupиз выводаgrep? - С помощью
egrepнайдите сведения о демонеsystemdв журнале системы, введя в приглашении командной строкиegrep systemd /var/log/messages. - Снова воспользуйтесь
egrepдля поиска сведений обо всех сетевых интерфейсах Ethernet, установленных в системе, введяegrep enp0s[0-3] /var/log/messagesв приглашении командной строки. - Найдите все строки в журнале системы, оканчивающиеся на
Enabled, введяegrep Enabled$ /var/log/messagesв приглашении командной строки.
Теперь вы — настоящий профессионал по файловым системам! Нужно оставаться скромным, когда знаешь так много!