Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по Bash для начинающих
Назад Глава 4: Регулярные выражения Вперед

Примеры использования grep

Что такое grep?

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

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

Несколько примеров:

cathy ~> grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

cathy ~> grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
12:operator:x:11:0:operator:/root:/sbin/nologin

cathy ~> grep -v bash /etc/passwd | grep -v nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
news:x:9:13:news:/var/spool/news:
mailnull:x:47:47::/var/spool/mqueue:/dev/null
xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false
rpc:x:32:32:Portmapper RPC user:/:/bin/false
nscd:x:28:28:NSCD Daemon:/:/bin/false
named:x:25:25:Named:/var/named:/bin/false
squid:x:23:23::/var/spool/squid:/dev/null
ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false
apache:x:48:48:Apache:/var/www:/bin/false

cathy ~> grep -c false /etc/passwd
7

cathy ~> grep -i ps ~/.bash* | grep -v history
/home/cathy/.bashrc:PS1="\[\033[1;44m\]$USER is in \w\[\033[0m\] "

В первой команде пользователь cathy отображает строки из файла /etc/passwd, в которых есть строка root.

Во втором примере отображаются, кроме того, номера строк, в которых есть искомая строка.

В третьей команде проверяется, кто из пользователей не использует bash, исключая те экаунты пользователей, у которых в качестве оболочки указан nologin.

Затем подсчитывает количество учетных записей, в которых в качестве командной оболочки указано /bin/false.

В последней команде отображаются строки из всех файлов домашнего директория пользователя cathy, имена которых начинаются с ~/.bash, за исключением тех файлов, в именах которых есть строка history, с тем, чтобы исключить соответствия, имеющиеся в файле ~/.bash_history, в котором может быть указана одна и та же строка в верхнем или нижнем регистрах . Обратите внимание, что осуществляется поиск строки "ps", а не команды ps.

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

Команда grep и регулярные выражения

Если вы не в системе Linux

В этих примерах мы используем команду GNU grep, в которой поддерживаются расширенные регулярные выражения. В системах Linux по умолчанию используется команда GNU grep. Если вы работаете в проприетарной системе, то с помощью параметра -V проверьте, с какой версией команды вы работаете. Команду GNU grep можно загрузить с http://gnu.org/directory/.

Привязка к строкам вода и к словам

В отличие от предыдущего примера, мы теперь хотим отобразить только те строки, которые начинаются со строки "root":

cathy ~> grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash

Если мы хотим увидеть, в каких учетных записях командная оболочка вообще не использовалась, мы ищем строки, заканчивающиеся сиволом ":":

cathy ~> grep :$ /etc/passwd
news:x:9:13:news:/var/spool/news:

Чтобы проверить, экспортируется ли в файле ~/.bashrc переменная PATH, сначала выберите строки с "export", а затем найдите строки, начинающиеся со строки "PATH"; в таком случае не будут отображаться MANPATH и другие возможные пути:

cathy ~> grep export ~/.bashrc | grep '\<PATH'
  export PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

Здесь \> соответствует концу слова.

Если вы хотите найти строку, которая является отдельным словом (окруженным пробелами), лучше использовать параметр -w, как в приведенном ниже примере, где показано, как найти в файле /etc/fstab строку, соответствующую корневому разделу (в этой строке символ / является отдельным словом):

cathy ~> grep -w / /etc/fstab
LABEL=/                 /                       ext3    defaults        1 1

Если этот параметр не будет использоваться, то будут отображаться все строки таблицы файловых систем.

Символьные классы

Выражением в квадратных скобках является список символов, заключенных внутри символов "[" и "]". Оно соответствует любому одиночному символу, указанному в этом списке; если первый символ списка есть "^", то оно соответствует любому символу, который ОТСУТСВУЕТ в списке. Например, регулярное выражение "[0123456789]" соответствует любой одиночной цифре.

Внутри выражения в квадратных скобках можно указывать диапазон, состоящий из двух символов, разделенных дефисом. Тогда выражение соответствует любому одиночному, который согласно правилам сортировки попадает внутрь этих двух символов, включая и эти два символа; при этом учитывается последовательность упорядочивания и набор символов, указанные в локали. Например, когда по умолчанию указана локаль C, выражение "[a-d]" эквивалентно выражению "[abcd]". Есть много локалей, в которых сортировка выполняется в словарном порядке, и в этих локалях "[a-d]", как правило, не эквивалентно "[abcd]", в них, например, оно может быть эквивалентно выражению "[aBbCcDd]". Чтобы использовать традиционную интерпретацию выражения, указываемого в квадратных скобках, вы можете воспользоваться локалью C, установив для этого в переменной окружения LC_ALL значение "C".

Наконец, есть определенным образом поименованные символьные классы, которые указываются внутри выражений в квадратных скобках. Дополнительную информацию об этих предопределенных выражениях смотрите на страницах man или в документации команды grep.

cathy ~> grep [yf] /etc/group
sys:x:3:root,bin,adm
tty:x:5:
mail:x:12:mail,postfix
ftp:x:50:
nobody:x:99:
floppy:x:19:
xfs:x:43:
nfsnobody:x:65534:
postfix:x:89:

В примере отображаются все строки, содержащие либо символ "y", либо символ "f".

Универсальные символы (метасимволы)

Используйте "." для поиска соответствия любому одиночному символу. Если вы хотите получить список всех английских слов, взятых из словаря, содержащих пять символов, начинающихся с "c" и заканчивающихся "h" (удобно для решения кроссвордов):

cathy ~> grep '\<c...h\>' /usr/share/dict/words
catch
clash
cloth
coach
couch
cough
crash
crush

Если вы хотите отобразить строки, в которых есть символ точки в виде литерала, то укажите в команде grep параметр -F.

Чтобы подобным образом найти слова, в которых мажду "c" и "h" может находиться любое число символов, используйте звездочку. В приведенном ниже примере из системного словаря выбираются все слова, начинающиеся с "c" и заканчивающиеся символом "h":

cathy ~> grep '\<c.*h\>' /usr/share/dict/words
caliph
cash
catch
cheesecloth
cheetah
--output omitted--

Если вы хотите найти в файле или в выходном потоке литеральный символ "звездочка", используйте для этого одинарные кавычки. Пользователь cathy в приведенном ниже примере сначала пытается в файле /etc/profile найти "звездочку" без использования кавычек, в результате чего ничего не находится. Когда используются кавычки, в выходной поток выдается результат:

cathy ~> grep * /etc/profile

cathy ~> grep '*' /etc/profile
for i in /etc/profile.d/*.sh ; do

Предыдущий раздел: Оглавление Следующий раздел:
Регулярные выражения   Поиск по шаблону с использованием возможностей Bash