Поиск текста с помощью grep в Linux

CompTIABeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы узнаете, как эффективно искать текст внутри файлов в системе Linux, используя мощную команду grep. Вы начнете с выполнения базового поиска определенных строк как в одном, так и в нескольких файлах, поймете, как grep отображает совпадающие строки и идентифицирует исходный файл при поиске по нескольким путям.

Опираясь на этот фундамент, вы изучите более продвинутые функции для уточнения результатов поиска. Вы научитесь отображать номера строк для понимания контекста, использовать якоря, такие как ^ и $, для поиска совпадений в начале или в конце строки, а также задействуете возможности базовых и расширенных регулярных выражений для выполнения сложного и гибкого сопоставления с образцом.

Выполнение базового поиска в файлах с помощью grep

На этом этапе вы изучите основы использования команды grep для выполнения простого поиска внутри файлов. Команда grep (Global Regular Expression Print) — это мощная утилита командной строки, используемая для поиска определенной строки или шаблона в одном или нескольких файлах и вывода строк, которые их содержат.

Базовый синтаксис grep выглядит так: grep PATTERN [FILE...]

Давайте начнем с простой задачи: найдем информацию о нашем текущем пользователе labex в базе данных пользователей системы. Эта информация хранится в файле /etc/passwd.

Выполните следующую команду в терминале, чтобы найти любые строки, содержащие строку labex в файле /etc/passwd:

grep labex /etc/passwd

Вы должны увидеть строку вывода из файла, которая содержит ваше имя пользователя labex.

labex:x:5000:5000::/home/labex:/usr/bin/zsh

Команда grep также может выполнять поиск в нескольких файлах одновременно. Теперь мы поищем строку labex в трех важных конфигурационных файлах системы: /etc/passwd, /etc/shadow (где хранится защищенная информация об учетных записях пользователей) и /etc/group (где определены группы пользователей).

Поскольку файл /etc/shadow содержит конфиденциальную информацию, для его чтения требуются права администратора. Вы можете использовать команду sudo, чтобы выполнить grep с этими привилегиями. Пользователь labex настроен на использование sudo без пароля.

Выполните следующую команду для поиска labex во всех трех файлах:

sudo grep labex /etc/passwd /etc/shadow /etc/group

Обратите внимание, что при поиске в нескольких файлах grep добавляет к каждой найденной строке имя файла, в котором было обнаружено совпадение.

/etc/passwd:labex:x:5000:5000::/home/labex:/usr/bin/zsh
/etc/shadow:labex:$y$j9T$L6UYJUCu2XytrdFToEOw.1$yp2xAOVTbIPmbABMnS/xDsyce7xayU80JgIs3lrqw4B:20265:0:99999:7:::
/etc/group:sudo:x:27:labex
/etc/group:ssl-cert:x:121:labex
/etc/group:labex:x:5000:
/etc/group:public:x:5002:labex

Это покажет вам все строки в этих трех файлах, которые связаны с пользователем labex.

Отображение номеров строк с помощью опции -n

На этом этапе вы узнаете, как улучшить вывод grep, отображая номера строк, в которых найдены совпадения. Это особенно полезно, когда вам нужно найти шаблон в большом файле для редактирования или дальнейшего анализа. Опция -n указывает grep добавлять к каждой строке вывода соответствующий номер строки из исходного файла.

Давайте дополним команду из предыдущего шага. Вы искали пользователя labex в трех системных файлах. Теперь вы выполните тот же поиск, но также выведете номера строк для каждого совпадения.

Добавьте опцию -n к команде, которую вы выполняли ранее. Не забудьте использовать sudo, так как вы все еще обращаетесь к защищенному файлу /etc/shadow.

Выполните следующую команду в терминале:

sudo grep -n labex /etc/passwd /etc/shadow /etc/group

Вы увидите результат, похожий на предыдущий, но теперь перед каждой строкой через двоеточие указано имя файла и номер строки, где произошло совпадение.

/etc/passwd:32:labex:x:5000:5000::/home/labex:/usr/bin/zsh
/etc/shadow:32:labex:$y$j9T$L6UYJUCu2XytrdFToEOw.1$yp2xAOVTbIPmbABMnS/xDsyce7xayU80JgIs3lrqw4B:20265:0:99999:7:::
/etc/group:21:sudo:x:27:labex
/etc/group:60:ssl-cert:x:121:labex
/etc/group:61:labex:x:5000:
/etc/group:62:public:x:5002:labex

Обратите внимание на числа 32, 32, 21, 60, 61 и 62 в выводе. Это номера строк. Например, строка labex была найдена на 32-й строке файла /etc/passwd и на 32-й строке файла /etc/shadow. Эта простая опция делает grep еще более эффективным инструментом для навигации и понимания содержимого файлов.

Сопоставление позиции в строке с помощью якорей ^ и $

На этом этапе вы повысите свои навыки работы с grep, научившись использовать якоря. Якоря — это специальные символы в регулярных выражениях, которые соответствуют не самим символам, а позициям внутри строки. Это позволяет создавать более точные и мощные шаблоны поиска. Два наиболее распространенных якоря:

  • ^ (карет): Соответствует началу строки.
  • $ (знак доллара): Соответствует концу строки.

Давайте посмотрим, как они работают на примере файла /etc/passwd.

Сначала рассмотрим простой поиск строки root в /etc/passwd:

grep root /etc/passwd

В выводе может появиться несколько строк, так как другие записи могут содержать подстроку "root".

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

Теперь давайте уточним запрос. В файле /etc/passwd первым полем каждой записи является имя пользователя. Чтобы найти запись именно для пользователя root, вы можете привязать поиск к началу строки с помощью ^.

Выполните следующую команду. Шаблон ^root указывает grep искать только те строки, которые начинаются с root.

grep ^root /etc/passwd

На этот раз вывод гораздо точнее и показывает только строку для пользователя root.

root:x:0:0:root:/root:/bin/bash

Затем воспользуемся якорем конца строки $. Последнее поле в записи /etc/passwd указывает оболочку входа пользователя по умолчанию. Мы можем использовать это, чтобы найти всех пользователей, у которых /bin/bash установлена в качестве оболочки по умолчанию.

Шаблон bash$ будет соответствовать любой строке, которая заканчивается строкой bash.

grep bash$ /etc/passwd

Эта команда отобразит все записи пользователей, которым назначена оболочка /bin/bash.

root:x:0:0:root:/root:/bin/bash

(Примечание: Ваш вывод может отличаться, если другие пользователи в системе также используют bash в качестве оболочки по умолчанию.)

Используя якоря ^ и $, вы можете значительно сузить результаты поиска, чтобы найти именно то, что вам нужно.

Сопоставление шаблонов с помощью базовых регулярных выражений

На этом этапе вы узнаете, как использовать базовые регулярные выражения (BRE) в grep для создания более гибких шаблонов поиска. В BRE определенные символы, называемые метасимволами, имеют специальные значения, выходящие за рамки их буквального начертания. Это позволяет искать закономерности, а не просто фиксированные строки.

Мы изучим два фундаментальных метасимвола: * (звездочка) и . (точка).

Сначала рассмотрим звездочку (*). Этот метасимвол соответствует символу, стоящему непосредственно перед ним, повторенному ноль или более раз. Чтобы увидеть это в действии, выполните следующую команду. Мы заключим шаблон в одинарные кавычки ('roo*'), чтобы оболочка воспринимала его буквально и не пыталась интерпретировать * как подстановочный знак для имен файлов.

grep 'roo*' /etc/passwd

Вывод, скорее всего, покажет несколько строк:

root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

Давайте проанализируем этот результат. Шаблон 'roo*' ищет строки, содержащие ro, за которыми следует ноль или более символов o.

  • Строка root подходит, так как содержит roo (ro и одна o).
  • Строка proxy подходит, так как содержит ro (ro и ноль o) в слове "proxy".
  • Строка systemd-timesync подходит, так как содержит ro в слове "Synchronization".
  • Строка rtkit подходит, так как содержит ro в слове "proc".
  • Строка operator подходит, так как содержит ro и в "operator", и в "/root".

Теперь рассмотрим метасимвол точки (.). Точка соответствует любому одному символу. Выполните следующую команду, чтобы увидеть разницу:

grep 'ro.' /etc/passwd

На этот раз вывод также покажет несколько совпадений:

root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

Шаблон 'ro.' ищет строки, содержащие ro, за которыми следует ровно один любой символ.

  • Строка root подходит, так как за ro следует o в слове "root".
  • Строка proxy подходит, так как за ro следует x в слове "proxy".
  • Строка systemd-timesync подходит, так как за ro следует n в слове "Synchronization".
  • Строка rtkit подходит, так как за ro следует c в слове "proc".
  • Строка operator подходит, так как за ro следует другой символ в "operator" и "/root".

Сравнивая результаты, вы можете наглядно увидеть мощь регулярных выражений. Оба шаблона 'roo*' и 'ro.' находят множество строк, демонстрируя, как различные метасимволы позволяют по-разному настраивать поиск.

Использование расширенных регулярных выражений для сложных поисков

На этом этапе вы научитесь использовать расширенные регулярные выражения (ERE) для выполнения еще более сложных и мощных поисков. ERE предлагает более богатый набор метасимволов, чем базовые регулярные выражения (BRE). Чтобы включить ERE, вы можете использовать команду grep -E или ее традиционный псевдоним egrep. Использование grep -E является более современным и рекомендуемым подходом.

Сначала изучим квантификаторы. В ERE вы можете указать точное количество повторений символа с помощью фигурных скобок {}. Например, чтобы найти любую строку, в которой есть ровно две строчные буквы 'o' подряд, можно использовать шаблон o{2}.

Выполните следующую команду. Мы заключаем шаблон в одинарные кавычки, чтобы оболочка не интерпретировала специальные символы.

grep -E 'o{2}' /etc/passwd

Вывод покажет несколько строк, содержащих "oo":

root:x:0:0:root:/root:/bin/bash
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

Эта команда работает, потому что шаблон o{2} специально ищет два идущих подряд символа 'o', которые встречаются в словах "root", "spool" и других записях.

Затем рассмотрим альтернацию (выбор). Эта мощная функция ERE позволяет искать один из нескольких возможных шаблонов с помощью символа вертикальной черты |, который действует как оператор «ИЛИ».

Например, если вы хотите найти запись пользователя либо для root, либо для Root (на случай, если вы не уверены в регистре первой буквы), вы можете использовать следующую команду:

grep -E 'root|Root' /etc/passwd

Эта команда ищет любую строку, содержащую либо строку root, либо строку Root. Вывод показывает:

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

Обе строки (для пользователя root и для operator) подходят, так как обе содержат строку "root" в нижнем регистре.

Расширенные регулярные выражения, включаемые с помощью grep -E, обеспечивают более выразительный и мощный синтаксис для создания сложных шаблонов поиска, что делает grep незаменимым инструментом для обработки текста.

Резюме

В этой лабораторной работе вы научились использовать команду grep для выполнения базового поиска текста в Linux. Вы начали с выполнения простого поиска определенной строки в одном файле, а затем перешли к поиску в нескольких файлах, наблюдая, как grep помечает найденные строки именами соответствующих файлов. Вы также научились использовать опцию -n для отображения номера строки каждого совпадения, что полезно для определения местоположения данных в файлах.

Кроме того, вы изучили более продвинутые возможности сопоставления с образцом, используя якоря для поиска текста в начале (^) или в конце ($) строки. В ходе работы были рассмотрены базовые и расширенные регулярные выражения, что позволило вам создавать более сложные и эффективные шаблоны поиска для нахождения специфической информации в файлах.