Приглашаем авторов

Вы пользуетесь Ubuntu и желаете поделиться секретами преодоления тех трудностей, с которыми вам пришлось столкнуться в процессе работы? Или же просто изложить алгоритм установки драйвера или настройки специфической программы, чтобы с легкостью найти в будущем? А быть может размещаете подобное в собственном блоге, но не находите благодарного читателя из-за специфики темы?

Предлагаем вам войти в команду Блога Ubuntu в Сумах, который поможет вам реализовать упомянутые выше интересы.

Узнать больше

пятница, 24 сентября 2010 г.

Просто о grep: мощном инструменте поиска в Linux

Вероятно, практически каждому, кто пользуется командной строкой в Linux, приходилось использовать утилиту grep, которая используется для поиска и вывода строк, соответствующих условиям поиска в  файлах или стандартном потоке вывода. Название представляет собой акроним английской фразы «search globally for lines matching the regular expression, and print them» — «искать везде строки, соответствующие регулярному выражению, и выводить их».

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

Весьма кстати попалась на глаза статья блоггера ashep, взяв которую за основу, я подготовлю свой "конспект" для использования этой утилиты  (удалив мало востребованное, и добавив необходимое), который, надеюсь, пригодится многим.


Самое простое применение: 
grep строка_поиска(регулярное выражение) файл_поиска
Как было упомянуто выше, grep может искать и в стандартном потоке вывода, поэтому аналогичное  действие выполнит и приведенная ниже команда:
 cat  файл_поиска | grep строка_поиска(регулярное выражение)
При этом вместо cat  файл_поиска может быть результат вывода любой другой команды. Так, например, чтобы получить список всех файлов, которые устанавливаются из пакета в каталог /usr/bin в Ubuntu можно так:
dpkg-query -L packagename | grep "/usr/bin"
Как и всё в UNIX, grep по умолчанию чувствителен в регистру символов. Если вам это не подходит, просто добавьте опцию -i к вызову grep, после чего строки «ПОИСК» и  «поиск» станут для неё равнозначными.

 Для поиска внутри каталогов используйте ключ -r . Например:


grep -r строка_поиска(регулярное выражение) *.txt

Что, если вы хотите найти всё, кроме чего-то? grep умеет и это тоже. Используйте опцию -v и grep будет выводить только те строки, которые не соответствуют шаблону.

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

Само собой, вы можете комбинировать опции. Например, чтобы найти файлы, не содержащие строк, соответствующих шаблону можно использовать
grep -v -l строка_поиска *
Вам не нужны имена файлов в выводе grep, а интересны лишь строки — воспользуйтесь опцией -h и grep не будет выводить имена файлов.

Для "статистических"  нужд могут пригодиться опции -c и -n
Так, с опцией -с  grep выдает только количество строк, содержащих образец, а с -n выдает перед каждой строкой ее номер в файле (строки нумеруются с 1).

По умолчанию grep выполняет «жадный» поиск. То есть, она захватывает не только часть строки, соответствующую шаблону, но и всё после неё. Например, если вы ищете «Beat», то grep будет считать соответствием и «Beatles», «Beaten», «Beats» и любую строку, содержащую «Beat». Вы можете строго ограничить поиск при помощи опции «-w». С этой опцией grep будет отбирать соответствия в пределах слова.

В процессе поиска по иногда нужно увидеть, в каком контексте найдено то или иное. По умолчанию grep выводит лишь строку, в которой было найдено совпадение, но есть несколько опций, позволяющих заставить grep выводить больше: -A (после контекста),  -B (перед контекстом) и -C (контекст).
Используя эти опции, необходимо указать саму опцию и целое число, определяющее количество строк для вывода. Например
grep -C 2 строка_поиска(регулярное выражение) файл_поиска
выведет строки, в которых найдено соответствие, плюс 2 строки до 2 после каждой найденной.

 Регулярные выражения в grep

grep может оказаться мало востребованной, если при помощи неё искать лишь какие-то конкретные последовательности символов.  А как быть с тем, если вам нужно найти, например, только цифры или последовательность символов, в которую могут входить лишь определённые символы или их группы? Не проблема! Используя регулярные выражения в grep, вы получаете инструмент практически для любой задачи поиска.

В командной оболочке символ звёздочки «*» соответствует любому символу ноль или более раз. В grep символ «*» имеет несколько иное значение. В grep этот символ необходимо группировать с другими. Например, если вам нужен тот же эффект, как и в оболочке, используйте следующее:
grep .* строка_поиска(регулярное выражение) файл_поиска
Если вам необходимо определить какой-то шаблон один и более раз, вы можете использовать конструкцию «+шаблон».

Символ «^» соответствует началу строки, а символ «$» — её концу. 

Например, вы хотите найти все файлы с расширением «.html», но вам не нужны файлы с расширением «.html.bak»:
ls | grep .*html$
Если вам необходимо, чтобы grep интерпретировала спецсивмолы как обычные — предварите их обратным слешем или заключите в одинарные кавычки. Например
grep '*' имя_файла
будет искать строки, содержащие символ звёздочки в файле.

В выражениях можно использовать диапазоны и классы символов. Для этого при составлении шаблона в grep используются квадратные скобки. 

Например, символу в диапазоне от A до Z будет соответствовать шаблон [A-Z]"", а любой цифре — [0-9]"". Также, используя квадратные скобки вы можете определять соответствие классам символов. Например, [:punct:]"" будет соответствовать любому знаку препинания. Например, чтобы найти строки, содержащие знаки препинания в конце, можно использовать следующую команду:

grep '[[:punct:]]$' файлы 

Обратите внимание на двойные скобки.

Советуем также обратить внимание на man-страницу grep, у которой есть и русскоязычный перевод

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.

Облако тегов

10.04 10.10 11.04 11.10 12.04 12.10 1C 32-bit 3D 64-bit 9.04 9.10 адресная строка анализ аплет апплет аудио батарея библиотеки блог браузер брошюра буфер обмена видео вывод горячие клавиши даунгрейд дистрибутив драйвер журнал загрузка захват звук ИБП игра интернет интерфейс кириллица клавиатура книга книжка кнопки кодеки командная строка комбинации клавиш коммерция компиляция конзоль копирование латинница локаль маршрутизация монтирование мультиплеер назначение клавиш настройка обновление образ объединение окно опрос оптимизация офис переименование печать плеер подкачка поиск потоковое аудио принтер проблема радио разделы разрезка раскладка клавиатуры рейтинг репозиторий русский сборка сеть скачать статистика Сумы темы терминал торрент транслит Украина установка файлы фильтр цитата эмуляция ядро ac3 adobe adventure air alsa AMD amd64 android apt ATI audio Avant Avenue avidemux boot camera Canon canonical capture cat Catalyst cdemu cdrom cgroups chrome 9 clipboard commodore compiz console cuneiform cups deadbeaf deadbeef deb debian deluge desura djvu document foundation downgrade dpkg driver dvd error ethernet firefox flac flash foobar2000 ftp game games GDM gecko getlibs Gimp git gnash gnome gnome shell go-oo grep grub gscan2pdf h.264 hdmi Homenet hotkeys hp html5 ice icq ifconfig intel internet ipwatchd iso jabber kde kernel keyboard layout knoppix koffice lame lexmark libreoffice lightdm lightspark Linux livecd lossless lts Lubuntu lucid LXDE MacOS mencoder microsoft mint mobile mozilla mp3 mplayer natty narwhal nautilus netbook network notebook Nvidia ocr ogg Oneiric Ocelot openoffice Opera oracle pdf peppermint phaser 3010 phaser 3040 php picture pidgin player polipo postscript Powercom ppa pppoe PPTP proxy pulseaudio python QR radiotray ru_UA russian Sauerbraten scan server shipit. shooter skype sound split squeeze stable streaming sun super os survival horror svn swap Telesweet tesseract theme thunar thunderbird tor torrent transcode translit ualinux Ubuntu ubuntu one Ubuntu Software Center ukrainian unity update-manager UPS usb usb-to-serial usb. com uTorrent vfat via video VLC VPN wavpack web-сервер Windows Wine Writer X-window x264 xerox xfce xmpp xonar dg xrandr xubuntu xvid zbar zend µTorrent