Поиск текста с помощью 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; просмотров: 1383;