Библиотека сайта rus-linux.net
Руководство по 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. Если вы работаете в проприетарной системе, то с помощью параметра |
Привязка к строкам вода и к словам
В отличие от предыдущего примера, мы теперь хотим отобразить только те строки, которые начинаются со строки "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 |