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

Команда grep производит поиск в указанных файлах строк по регулярному выражению. Команда выводит в случае удачного поиска имя файла и строку, удовлетворяющую заданному регулярному выражению. Если входные файлы не заданы, то команда производит ввод из стандартного потока ввода. При этом используются три разновидности команды grep (далее идет речь о GNU-версии команды grep):

r grep — интерпретирует регулярные выражения с обычным (basic) синтак- сисом;

r grep -F или fgrep — не интерпретирует регулярные выражения, воспри- нимая их как обычные текстовые строки;

r grep -E или egrep — позволяет работать с расширенным синтаксисом регулярных выражений.


 

Команды grep, egrep и fgrep, разработанные в проекте GNU, обычно реали- зованы в виде жестких связей (или символических ссылок). То есть все эти три команды являются одним файлом. В других разновидностях UNIX- подобных систем это не так. Приведенные далее примеры не всегда будут работать так же в других операционных системах, например, в Sun Solaris или FreeBSD.

Для поиска всех пользователей системы, использующих оболочку bash, до- статочно выполнить команду grep с обычным регулярным выражением (пример 9.1).

 

Пример 9.1. Поиск с помощью обычного регулярного выражения

 

$ grep 'bash$' /etc/passwd

root:x:0:0:System Administrator:/root:/bin/bash tania:x:502:502::/home/tania:/bin/bash figus:x:503:503::/home/figus:/bin/bash user1:x:504:100::/home/user1:/bin/bash

 

Регулярное выражение взято в апострофы для предотвращения интерпрета- ции символа доллара оболочкой (пример 9.1). Доллар здесь обозначает конец строки.

Теперь, например, требуется выделить из всех файлов в каталоге /etc/sysconfig/ все строки, содержащие IP-адреса в стандарте IPv4. Такую задачу удобнее всего решать с помощью расширенного синтаксиса регулярных выражений, т. е. используя команду egrep (пример 9.2).

 

Пример 9.2. Поиск с помощью расширенных регулярных выражений

 

$ egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}' /etc/sysconfig/*

 

В этой команде обеспечивается поиск последовательности из одной, двух или трех любых десятичных цифр, которая должна быть троекратно про- должена такой же последовательностью. Причем каждая последователь- ность отделена от предыдущей последовательности точкой. Командой fgrep удобно пользоваться для поиска строк, содержащих символы, имею- щие особое значение, как регулярные выражения. Так, например, можно получить список всех процессов, не связанных с какими-либо терминалами (пример 9.3).


 

Пример 9.3. Использование fgrep

 

$ ps -e | fgrep '?'

 

Команда fgrep воспринимает знак вопроса просто как обычный символ, ко- торый должен быть найден в строке.

Опция -i позволяет производить поиск без учета регистра. Приведенный да- лее пример 9.4 демонстрирует, как с помощью поиска с игнорированием ре- гистра найти все процессы в системе, где в командной строке есть подстрока X или x.

 

Пример 9.4. Поиск с игнорированием регистра

 

$ ps -e | grep -i x

1546 ? 00:00:01 xfs

1599 ? 00:00:19 X

1752 ? 00:00:00 xvt

 

Если требуется подсчитать число вхождений регулярного выражения, то для этого используется опция -c (пример 9.5).

 

Пример 9.5. Подсчет вхождений регулярного выражения

 

$ egrep -c '^.{1,3}:' /etc/passwd 7

 

В приведенном примере 9.5 подсчитано, сколько имеется пользователей, длины имен которых не превышают три символа.

Опция -v команды grep инвертирует алгоритм поиска: команда начинает ис- кать строки, не удовлетворяющие регулярному выражению. Так, предполо- жим, что требуется найти список всех групп из файла /etc/group, в которые не входит пользователь user1 (пример 9.6).

 

Пример 9.6. Инверсия условия поиска

 

$ grep -v user1 /etc/group

 

Если в регулярном выражении не указаны какие-либо ограничители, связан- ные с началом или концом слова, то команда grep производит поиск под- строки, а не слова. В команде egrep начало и конец слова можно обозначить


 

регулярными выражениями, соответственно, \< и \>. Например, в файле

/etc/sysctl.conf для поиска всех строк, в которых встречается слово Enable, но не Enables, можно использовать команду, приведенную в примере 9.7.

 

Пример 9.7. Поиск слова

 

$ egrep '\<Enable\>' /etc/sysctl.conf

# Enable the magic-sysrq key

# Enable tcp_syncookies

 

Однако в таком случае гораздо удобнее воспользоваться опцией -w команды

grep, которая устанавливает режим поиска по целому слову (пример 9.8).

 

Пример 9.8. Поиск слова с помощью опции -w

 

$ grep -w Enable /etc/sysctl.conf

# Enable the magic-sysrq key

# Enable tcp_syncookies

 

При необходимости можно также установить режим поиска по целой строке, для чего предназначена опция -x. Приведенная в примере 9.9 команда позво- лит отыскать в каталоге /etc все файлы, которые содержат строки, состоящие из одного символа.

 

Пример 9.9. Поиск целой строки с помощью опции -x

 

$ grep -x '.' /etc/*

 

Использование опции -n позволяет установить режим вывода номеров строк, в которых найдены искомые строки. Так, например, требуется получить строки файла /etc/hosts, содержащие подстроки local, и номера этих строк (пример 9.10).

 

Пример 9.10. Отображение номеров строк

 

$ grep -n local /etc/hosts

1:127.0.0.1 localhost.localdomain localhost

 

Здесь в первом поле вывода перед двоеточием указан номер строки, в кото- рой найдена искомая подстрока (см. пример 9.10).


 

Опция -r заставляет команду grep работать рекурсивно, обрабатывая файлы в подкаталогах. Например, в каталоге /usr/share/doc/HOWTO/ требуется най- ти все файлы, содержащие строку trainer (пример 9.11).

 

Пример 9.11. Рекурсивный поиск

 

$ grep -r trainer /usr/share/doc/HOWTO/

 








Дата добавления: 2015-06-12; просмотров: 1345;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.016 сек.