1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
find / -user vasya - найти все директории и файлы принадлежащие пользователю vasya. поиск будет производиться, начиная с корневой директории (/) find / -name filedir - найти директории и файлы с именем filedir. поиск будет производиться, начиная с корневой директории (/) find /usr/bin -type f -atime +20 - найти все файлы в директории /usr/bin, время последнего обращения к которым более 20 дней find /usr/bin -type f -mtime -10 - найти все файлы в директории /usr/bin, которые были созданы или модифицированы в течении последних 10 дней find / -xdev -name \*.rpm - искать директории и файлы, имена которых оканчиваются на ".rpm", но игнорируя съёмные накопители, cdrom, usb и т.п. find . -maxdepth 1 -name *.jpg -print -exec convert - найти в текущей директории все файлы с расширением jpg и выполнить для каждого команду convert ( Imagemagick ) find /path/to/dir -name \*.c - найти все директории и файлы, имена которых оканчиваются на ".с". Поиск будет производиться, начиная с директории /path/to/dir find / -name *.rpm -exec chmod 755 '{}' \; - начиная с корня, найти все фалы и директории, имена которых оканчиваются на ".rpm", и для каждого изменить права доступа whereis ls - вывод полных путей к бинарным файлам, файлом исходных кодов и руководств, имеющих отношение к файлу ls locate \*.ps - поиск всех файлов, содержащих в имени ".ps" по специальной базе данных, предварительно сформированной командой updatedb which ls - вывести полный путь до файла ls |
Рубрика: find \ grep \ поиск
Основное:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
точка . - любой один символ ? - любой один символ * - любое кол-во символов а* - a, ab, abc и aecjejich ^ - начало строки $ - конец строки ^а - Любое «а», находящееся в начале строки *а$ - Любое «а», находящееся в конце строки а.с - Трехсимвольные строки, начинающиеся с «а» и заканчивающиеся на «с» [] - диапазон [^a] - прикол в таких скобках с "^" все что угодно только не "a" [^0-9] [^[:alnun:]] [bcf]at - bat, cat или fat [a-d]at - aat, bat, cat, dat, но не Aat, Bat и т. д. [A-D]at - Aat, Bat, Cat и Dat, но не aat, bat и т. д. 1[3-5]7 - 137,147 и 157 [0-9] [[:digit:]] \d \D [a-z] [A-Z] [a-zA-Z0-9] [[:alnun:]] \w \W [[:space:]] \s \S d{n,m} - квантификатор {} - последовательность touch {6,7,8}.txt - последовательно создаст файлы 6.txt, 7.txt, 8.txt grep -E '[0-9]{1,3}' \tHello - Символ табуляции, предшествующий слову hello \[tT][xX][Tt] - .txt, .TXT, .TxT или другие сочетания на основе изменения регистра \n - новая строка \r - символ возврата |
Примеры:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
!!! Используйте grep -E тогда можно будет использовать нормально регулярные выражения grep -E "[192]+\.[0-9]+\.[0-9]+\.[0-9]" ifconfig | grep -E "[192]+\.[0-9]+\.[0-9]+\.[0-9]" ip a s | grep -E "inet [192]+\.[168]" ip a s | grep -E "[192]+\.[0-9]+\.[0-9]+\.[0-9]" ifconfig | grep -E "[192]+\.[0-9]+\.[0-9]+\.[0-9]" ip a s | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" ifconfig | grep -E "(^|[[:space:]])[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}($|[[:space:]])" grep -E "что" "Где" - искать что в файле grep -Er "что" * - искать что во всех файлах и каталогах grep -Eri "что" "Где" - искать что во всех файла и каталогах игнорируя регистр grep -Eriv "что" "Где" - показать все файлы где нет что |
Рубрики
grep
Пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
!!! Используйте -E для нормальной работы grep по шаблону grep шаблон путь_к_файлу - поиск в файле по шаблону grep "что" "Где" - искать в файле grep [0-9] /var/log/messages - отобрать и вывести строки содержащие цифровые символы из файла /var/log/messages grep ^Aug /var/log/messages - отобрать и вывести строки, начинающиеся с сочетания символов "Aug", из файла /var/log/messages grep Aug /var/log/messages - отобрать и вывести строки, содержащие сочетание символов "Aug" из файла /var/log/messages grep Aug -R /var/log/* - отобрать и вывести строки, содержащие сочетание символов "Aug", из всех файлов, расположенных в директории /var/log и ниже grep -nri 'foobar' * - найти по папкам данное слово и вывести номер строки и путь до файла grep -Er "что" * - искать что во всех файлах и каталогах grep -Eri "что" "Где" - искать что во всех файла и каталогах игнорируя регистр grep -ri "что_ищем" * - поиск в файлах "что_ищем" в текущем каталоге рекурсивно grep -riv "что_ищем" * - показать все файлы кроме "что_ищем" grep -v '^#' configfile | cat -s > nocomments - прочитать файл удалив строки с комментариями и сохранив в файл nocomments grep -irns "что_ищем" - будет искать начиная с текущего каталога, покажет имя файла и строку grep -nri 'foobar' * - найти по папкам данное слово и вывести номер строки и путь до файла grep -Er "что" * - искать что во всех файлах и каталогах grep -Eri "что" "Где" - искать что во всех файла и каталогах игнорируя регистр grep -r -i "что_ищем" * - поиск в файлах "что_ищем" в текущем каталоге рекурсивно grep -r -i -v "что_ищем" * - показать все файлы кроме "что_ищем" grep -v '^#' configfile | cat -s > nocomments - прочитать файл удалив строки с комментариями и сохранив в файл nocomments Рекурсивный поиск шаблона в группе файлов grep -R /way/to/*any/folder/ foo grep foo `ls -R /way/to/any*/folder/text.file` grep foo `find /way/to/*any/folder/ -name "text.file"` for file in /way/to/some/folder/text*.file; do grep foo $file; done Несколько фильтров И/ИЛИ: !!! благодаря пайп "|" , grep позволяет использовать несколько фильтров virsh list --all | grep -vE "Id|^$|---" - строки Id, пустые строки(^$) и исключить строки (---) cat config_filename | grep -vE "^#|^$" - смотрим конфиги без комментариев (^#) и пустых строк (^$) ls -la | grep -E "file1|file2" - показать file1 и file2 cat file | grep -iE "(one|two|three)" - отфильтровать строки без учёта регистра, содержащие одно из слов one, two, three |
Фильтрация потока вывода других программ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Давайте представим, например, что вам нужно получить список всех файлов, которые устанавливаются из пакета в каталог /usr/bin. В Debian-системах попробуйте команду: dpkg-query -L packagename | grep "/usr/bin" Для систем с RPM команда будет выглядеть так: rpm -q --filesbypkg packagename | grep "/usr/bin" Таким образом, вместо вывода полного списка всех файлов пакета, вы получите только те, которые предназначены для установки в каталог /usr/bin. Вы можете пойти дальше, и при помощи следующего перенаправления в grep, сузить результаты фильтрации. Как и всё в UNIX, grep по умолчанию чувствителен в регистру символов. Если вам это не подходит, просто добавьте опцию «-i» к вызову grep, после чего строки «ПОИСК» и «поиск» станут для неё равнозначными. |
Контекст:
1 2 3 4 5 6 7 8 9 10 11 |
В процессе поиска по лог-файлам часто нужно увидеть, в каком контексте найдено то или иное. По умолчанию grep выводит лишь строку, в которой было найдено совпадение, но есть несколько опций, позволяющих заставить grep выводить больше: «-A» (после контекста), «-B» (перед контекстом) и «-C» (контекст). Используя эти опции, необходимо указать саму опцию и целое число, определяющее количество строк для вывода. Например: grep -C 2 pattern files - выведет строки, в которых найдено соответствие, плюс 2 строки до 2 после каждой найденной. |
Шаблоны и регулярные выражения:
1 2 3 4 5 6 7 8 9 10 |
а* - a, ab, abc и aecjejich ^а - Любое «а», находящееся в начале строки *а$ - Любое «а», находящееся в конце строки а.с - Трех символьные строки, начинающиеся с «а» и заканчивающиеся на «с» [bcf]at - bat, cat или fat [a-d]at - aat, bat, cat, dat, но не Aat, Bat и т. д. [A-D]at - Aat, Bat, Cat и Dat, но не aat, bat и т. д. 1[3-5]7 - 137,147 и 157 \tHello - Символ табуляции, предшествующий слову hello \[tT][xX][Tt] - .txt, .TXT, .TxT или другие сочетания на основе изменения регистра |
Регулярные выражения подробней:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
grep может оказаться совершенно неиспользуемой в повседневной жизни, если вы собираетесь при помощи неё искать лишь какие-то конкретные последовательности символов. А как быть с тем, если вам нужно найти, например, только цифры или последовательность символов, в которую могут входить лишь определённые символы или их группы? Не проблема! Используя регулярные выражения в grep, вы получаете инструмент для решения чуть ли не любой задачи поиска. Давайте немного рассмотрим регулярные выражения, которые, вероятно, вам пригодятся. В командной оболочке символ звёздочки «*» соответствует любому символу ноль или более раз. В grep символ «*» имеет несколько иное значение. В grep этот символ необходимо группировать с другими. Например, если вам нужен тот же эффект, как и в оболочке, используйте следующее: grep '.*' pattern files Если вам необходимо определить какой-то шаблон один и более раз, вы можете использовать конструкцию «+шаблон». Символ «^» соответствует началу строки, а символ «$» — её концу. Например, вы хотите найти все файлы с расширением «.html», но вам не нужны файлы с расширением «.html.bak»: ls | grep '.*html$' Если вам необходимо, чтобы grep интерпретировала спецсимволы как обычные — предварите их обратным слешем. Например: grep '\*' filename - будет искать строки, содержащие символ звёздочки в filename. В выражениях можно использовать диапазоны и классы символов. Для этого при составлении шаблона в grep используются квадратные скобки. Например, символу в диапазоне от A до Z будет соответствовать шаблон [A-Z]"", а любой цифре — [0-9]"". Также, используя квадратные скобки вы можете определять соответствие классам символов. Например, [:punct:]"" будет соответствовать любому знаку препинания. Например, чтобы найти строки, содержащие знаки препинания в конце, можно использовать следующую команду: grep '[[:punct:]]$' files Обратите внимание на двойные скобки. Вообще, об использовании регулярных выражений в grep лучше всего проконсультируйтесь с её man-страницей. Поначалу, понимание того, что написано там, может даваться вам с некоторым трудом, однако не поленитесь, и вы сможете овладеть мощным инструментом — регулярными выражениями. |
Цвета
1 2 3 4 5 6 7 8 |
Зачастую в выводе grep трудновато бывает сразу же отыскать соответствующую шаблону часть строки. Чтобы упростить задачу визуального поиска среди результатов выдачи grep, вы можете попросить её использовать цвет для отметки совпадений. Просто добавьте опцию «--color=always» или «--color=auto»! Обратите внимание, что в некоторых дистрибутивах разработчики создают псевдоним для grep, включающий цвет по умолчанию. Например, в Linux Mint команда «grep» имеет псевдоним «grep --color=auto». Если у вас похожая ситуация, то используйте команду «grep --color=off» в случаях, когда вам не нужен «цветной» вывод. |
Переменные присвоение:
1 2 3 4 5 6 7 8 9 10 11 12 |
env - показать значения переменных set | less - показать все активные переменные ABC=123 - присвоить переменно ABC значение 123 export ABC=123 - экспортировать переменную export PATH=$PATH:/home/nick_name - объединить строку и существующую переменную echo $ABC - отобразить содержимое переменно ABC unset ABC - отменить присвоение переменной |
Сравнения переменных:
1 2 3 4 5 6 7 |
varl = var2 - Проверяет, равна ли первая переменная второй varl -eq var2 - Контролирует, равна ли первая переменная второй varl -ge var2 - Поверяет, больше ли первая переменная второй или они равны varl -gt var2 - Контролирует, больше ли первая переменная второй varl -le var2 - Поверяет, меньше ли первая переменная второй или они равны varl -It var2 - Обследует, меньше ли первая переменная второй varl != var2 - Проверяет неравенство первой и второй переменных varl -ne var2 |
Регулярные выражения и спец символы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
точка . - текущий каталог (пример использования cp /tmp/file.txt .) две точки .. каталог на уровень выше (пример использования cd ..) ? - любой один символ * - любое кол-во символов а* - a, ab, abc и aecjejich ^ - начало строки $ - конец строки ^а - Любое «а», находящееся в начале строки *а$ - Любое «а», находящееся в конце строки а.с - Трехсимвольные строки, начинающиеся с «а» и заканчивающиеся на «с» [] - диапазон [bcf]at - bat, cat или fat [a-d]at - aat, bat, cat, dat, но не Aat, Bat и т. д. [A-D]at - Aat, Bat, Cat и Dat, но не aat, bat и т. д. 1[3-5]7 - 137,147 и 157 {} - последовательность touch {6,7,8}.txt - последовательно создаст файлы 6.txt, 7.txt, 8.txt \tHello - Символ табуляции, предшествующий слову hello \[tT][xX][Tt] - .txt, .TXT, .TxT или другие сочетания на основе изменения регистра |
вывод err,out,in:
1 2 3 4 5 6 7 8 9 |
Пере направление потока ввода/вывода 2>stderr - ошибки, информация 1>stdout - вывод (экран) 0>stdin - ввод (клавиатура) echo $? |
Пример с ping:
1 2 |
ip=1.1.1.1 ping -c1 -w1 $ip >/dev/null 2>&1 && echo OK |
Рубрики
find / поиск
find:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
!!! Внимание при использовании шаблонов рекомендуется шаблон брать в одинарные кавычки 'шаблон' find где параметр что параметр find / type -f -name '*.html' - искать файлы заканчивающиеся на .html find / -user vasya - поиск файлов принадлежащие пользователю vasya find / -type f -name file1 - найти все файлы с именем file1 find /etc -type d | sort - ищет все каталоги, находящиеся в /etc/ и вывод сортируется по имени atime — время последнего ДОСТУПА к файлу (например, чтение, исполнение). Можно увидеть командой ls -lu mtime — время последнего изменения файла (его содержимого). Можно увидеть командой ls -l ctime — время последнего изменения прав доступа или владельца. Можно увидеть командой ls -lc find /usr/bin -type f -atime +20 - найти все файлы в директории /usr/bin, время последнего обращения к которым более 20 дней find /usr/bin -type f -mtime +10 - найти все файлы в директории /home, время последнего изменения файла больше 10 дней find /var/backup/www -name "*.tar.gz" -mtime +30 |xargs /bin/rm -f "{}"; - найти все файлы старше 30 дней и удалить find /mnt/datastore1/backup_VM/mail/ -type f -name "*.qcow2.gz" -mtime +30 -delete - найти все файлы(-type f) с именем (-name "*.qcow2.gz") старше 30 дней и удалить find / -name *.rpm -exec chmod 755 "{}"\; - найти все директории и файлы, имена которых оканчиваются на ".rpm", и изменить им права на "755" find /dir -name *.bra -exec chown www.www "{}"\; - найти все директории и файлы, имена которых оканчиваются на ".bra", и изменить владельца и группу на www find /zzzz/gallery/ -type f -name *_backup -delete - найти файлы в имени которых (окончание *_backup) и удалить их (внутри папок тоже удалит) find /zzzz/gallery/ -type d -name dir_name -delete - найти директории с именем (dir_name) и удалить их (удалит только пустые директории) find /dir/dir/ -type d -name "моя_папка" -exec rm -rf "{}"\; - найти все директории с именем "моя_папка" и удалить папки с файлами whereis ls - найти все фалы и директории, м именем ls which ls - вывести полный путь до файла ls locate \*.ps - ищем файлы *.ps |
Поиск файлов по имени:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
find . -name file.txt -print - просмотреть дерево каталогов, начиная с текущего, и найти file.txt find понимает служебные символы. Не забудьте заключить строку, содержащую их, в кавычки, иначе shell будет пытаться транслировать их прежде, чем они будут переданы программе find. find . -name "file*" -print - просмотреть дерево каталогов, начиная с текущего, и найти file Если Вы ищете в большом дереве каталогов, команда find может работать довольно медленно. Иногда удобнее использовать команду locate. Она не ищет файл непосредственно в файловой системе, а просматривает свою базу данных. Такой метод намного быстрее, но база данных может устареть. В некоторых дистрибутивах эта база модифицируется каждую ночь. updatedb - чтобы модифицировать базу сейчас locate file - ищем файл в базе Имя файла может быть не lostfile.txt, а lastfile.txt или leastfile.txt или lostfiles.txt или Lotsfile.txt или lostfile.text, и Вы не помните имя точно. Как теперь найти файл? В такой ситуации очень полезна «fault tolerant file find utility» (толерантная к ошибкам утилита поиска файлов), ftff. ftff разрешает сделать несколько «орфографических ошибок» в имени файла при поиске. ftff lostfiles.txt - эта команда нашла бы все вышеперечисленные файлы ftff -t2 "lostfiles*" - ищем, разрешить максимум 2 ошибки (опция t2) и использовать служебный символ |
find, fgrep, egrep:
1 2 3 4 5 6 7 8 |
Иногда необходимо найти все файлы в дереве, имя которых не содержит некоторую строку. Например, все файлы за исключением .o и .c. find . ! -name "*.o" ! -name "*.c" -print find . -print | fgrep -v '.o' | fgrep -v '.c' если у Вас gnu версия find: find | fgrep -v '.o' | fgrep -v '.c' find | egrep -v '\.[oc]' |
Обзор дерева каталогов:
1 2 3 4 5 6 |
tree - отображает дерево каталогов в виде диаграммы tree -fF - отображает дерево каталогов в виде диаграммы с длинными именами файлов find . -ls find . -print или для gnu find: find . -printf "%7s %p\n" |
Стандартные утилиты для поиска текстовых строк в файлах:
1 2 3 4 5 6 7 |
grep/egrep - для обычных поисков выражения fgrep - для поиска литеральных строк egrep -i "search expression" * egrep -i "expression" `find . -type f -print` - чтобы искать строки во всех файлах дерева каталогов find . -type f -exec egrep -i "exp" /dev/null {} \; - чтобы искать строки во всех файлах каталогов find . -type f -print | xargs egrep -i "exp" - чтобы искать строки во всех файлах дерева каталогов agrep -i -2 "search exp" * - чтобы искать выражение и разрешить максимум 2 орфографические ошибки |
find + rm:
1 2 3 4 |
Следующая команда удаляет все резервные копии, содержащиеся в данном каталоге и во всех подкаталогах. При этом find строит список всех сомнительных файлов и передает его команде rm через подстановку команды ($(команда)). rm $(find . -name '*-') |
Ссылка:
1 |
http://habrahabr.ru/post/102442/ |
Что такое «регулярное выражение»?
1 2 3 |
Регулярное выражение (по англ. regular expression, сокр. «regexp» или «regex», в отечестве иногда зовется «регулярка» — прим. пер.) — это особый синтаксис используемый для описания текстовых шаблонов. В Linux-системах регулярные выражения широко используются для поиска в тексте по шаблону, а также для операций поиска и замены на текстовых потоках. |
В сравнении с глоббингом
1 2 3 4 |
Как только мы начнем рассматривать регулярные выражения, возможно вы обратите внимание, что их синтаксис очень похож на синтаксис подстановки имен файлов (globbing), который мы рассматривали в первой части. Однако, не стоит заблуждаться, эта схожесть очень поверхностна. Регулярные выражения и глоббинг-шаблоны, даже когда они выглядят похоже, принципиально разные вещи. |
Простая подстрока
1 2 3 4 5 6 7 8 9 10 11 12 |
После этого предостережения, давайте рассмотрим самое основное в регулярных выражениях, простейшую подстроку. Для этого мы воспользуемся «grep», командой, которая сканирует содержимое файла согласно заданному регулярному выражению. grep выводит каждую строчку, которая совпадает с регулярным выражением, игнорируя остальные: $ grep bash /etc/passwd operator:x:11:0:operator:/root:/bin/bash root:x:0:0::/root:/bin/bash ftp:x:40:1::/home/ftp:/bin/bash Выше, первый параметр для grep, это regex; второй — имя файла. grep считывал каждую строчку из /etc/passwd и прикладывал на нее простую regex-подстроку «bash» в поисках совпадения. Если совпадение обнаруживалось, то grep выводил всю строку целиком; в противном случае, строка игнорировалась. |
Понимание простой подстроки
1 2 3 4 5 6 7 8 9 |
В общем случае, если вы ищите подстроку, вы просто можете указать её буквально, не используя каких-либо «специальных» символов. Вам понадобиться особо позаботиться, только если ваша подстрока содержит +, ., *, [, ] или \, в этом случае эти символы должны быть экранированы обратным слешем, а подстрока заключаться в кавычки. Вот несколько примеров регулярных выражений в виде простой подстроки: /tmp (поиск строки /tmp) "\[box\]" (поиск строки [box]) "\*funny\*" (поиск строки *funny*) «ld\.so» (поиск строки ld.so) |
Мета символы
1 2 3 4 5 6 7 8 9 10 11 12 13 |
С помощью регулярных выражений используя мета символы возможно осуществлять гораздо более сложный поиск, чем в примерах, которые недавно рассматривали. Один из таких мета символов "." (точка), который совпадает с любым единичным символом: $ grep dev.sda /etc/fstab /dev/sda3 / reiserfs noatime,ro 1 1 /dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 swap swap sw 0 0 #/dev/sda4 /mnt/extra reiserfs noatime,rw 1 1 В этом примере текст dev.sda не появляется буквально ни в одной из строчек из /etc/fstab. Однако, grep сканирует его не буквально по строке dev.sda, а по dev.sda шаблону. Запомните, что "." будет соответствовать любому единичному символу. Как вы видите, мета символ "." функционально эквивалентен тому, как работает мета символ "?" в glob-подстановках. |
Использование []
1 2 3 4 5 6 7 8 9 |
Если мы хотим задать символ конкретнее, чем это делает ".", то можем использовать [ и ] (квадратные скобки), чтобы указать подмножество символов для сопоставления: $ grep dev.sda[12] /etc/fstab /dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 swap swap sw 0 0 Как вы заметили, в частности, данная синтаксическая конструкция работает идентично конструкции "[]" при glob-подстановке имен файлов. Опять же, в этом заключается одна из неоднозначностей в изучении регулярных выражений: синтаксис похожий, но не идентичный синтаксису glob-подстановок, что сбивает с толку. |
Использование [^]
1 2 3 4 5 6 |
Вы можете обратить значение квадратных скобок поместив ^ сразу после [. В этому случае скобки будут соответствовать любому символу который НЕ перечислен внутри них. И опять, заметьте что [^] мы используем с регулярными выражением, а [!] с glob: $ grep dev.hda[^12] /etc/fstab /dev/hda3 / reiserfs noatime,ro 1 1 #/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1 |
Отличающийся синтаксис
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Очень важно отметить, что синтаксис внутри квадратных скобок коренным образом отличается от остальной части регулярного выражения. К примеру, если вы поместите "." внутрь квадратных скобок, это позволит квадратным скобкам совпадать с "." буквально, также как 1 и 2 в примере выше. Для сравнения, "." помещенная вне квадратных скобок, будет интерпретирована как мета символ, если не приставить "\". Мы можем получить выгоду из данного факта для вывода строк из /etc/fstab которые содержат строку dev.sda, как она записана: $ grep dev[.]sda /etc/fstab Также, мы могли бы набрать: $ grep "dev\.sda" /etc/fstab Эти регулярные выражения вероятно не удовлетворяют ни одной строчке из вашего /etc/fstab файла. |
Мета символ *
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Некоторые мета символы сами по себе не соответствуют ничему, но изменяют значение предыдущего символа. Один из таких символов, это * (звездочка), который используется для сопоставления нулевому или большему числу повторений предшествующего символа. Заметьте, это значит, что * имеет другое значение в регулярках, нежели в глоббинге. Вот несколько примеров, и обратите особое внимание на те случаи где сопоставление регулярных выражений отличается от glob-подстановок: ab*c совпадает с «abbbbc», но не с «abqc» (в случае glob-подстановки, обе строчки будут удовлетворять шаблону. Вы уже поняли почему?) ab*c совпадает с «abc», но не с «abbqbbc» (опять же, при glob-подстановке, шаблон сопоставим с обоими строчками) ab*c совпадает с «ac», но не с «cba» (в случае глоббинга, ни «ac», ни «cba» не удовлетворяют шаблону) b[cq]*e совпадает с «bqe» и с «be» (glob-подстановке удовлетворяет «bqe», но не «be») b[cq]*e совпадает с «bccqqe», но не с «bccc» (при глоббинге шаблон точно так же совпадет с первым, но не со вторым) b[cq]*e совпадает с «bqqcce», но не с «cqe» (так же и при glob-подстановке) b[cq]*e удовлетворяет «bbbeee» (но не в случае глоббинга) .* сопоставим с любой строкой (glob-подстановке удовлетворяют только строки начинающиеся с ".") foo.* совпадет с любой подстрокой начинающийся с «foo» (в случае glob-подстановки этот шаблон будет совпадать со строками, начинающимися с четырех символов «foo.») Итак, повторим для закрепления: строчка «ac» подходит под регулярное выражение «ab*c» потому, что звездочка также позволяет повторение предшествующего выражения (b) ноль раз. И опять, ценно отметить для себя, что мета символ * в регулярках интерпретируется совершенно иначе, нежели символ * в glob-подстановках. |
Начало и конец строки
1 2 3 4 5 6 7 |
Последние метасимволы, что мы детально рассмотрим, это ^ и $, которые используются для сопоставления началу и концу строки, соответственно. Воспользовавшись ^ в начале вашего regex, вы «прикрепите» ваш шаблон к началу строки. В следующем примере, мы используем регулярное выражение ^#, которое удовлетворяет любой строке начинающийся с символа #: $ grep ^# /etc/fstab # /etc/fstab: static file system information. # |
Полно строчные регулярки
1 2 3 4 5 6 7 8 9 10 |
^ и $ можно комбинировать, для сопоставлений со всей строкой целиком. Например, нижеследующая регулярка будет соответствовать строкам начинающимся с символа #, а заканчивающимся символом ".", при произвольном количестве символов между ними: $ grep '^#.*\.$' /etc/fstab # /etc/fstab: static file system information. В примере выше мы заключили наше регулярное выражение в одиночные кавычки, чтобы предотвратить интерпретирование символа $ командной оболочкой. Без одиночных кавычек $ исчез бы из нашей регулярки еще даже до того, как grep мог его увидеть. |