Tag Archiv: поиск

Просто о 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, у которой есть и русскоязычный перевод

Возвращаем старое контекстное меню в Opera 10.60

За прошедшие три дня с момента установки Opera 10.60 чувство раздражения от одного из новшеств достигло своего апогея. Речь идет об измененном контекстном меню выделенного текста. Отточенное до рефлексов действие копирования за несколько лет  использования теперь приводит к поиску выделенной фразы. Причиной этого является установка разработчиками браузера не первое место опции «Поиск» вместо привычного «Копирование». 
К счастью, вернуть старый порядок команд контекстного меню несложно.

1. Закрываем Opera (!!!).

2. Создаем каталог для настроек меню (для отдельного пользователя — cебя).
mkdir —parents ~/.opera/menu

3. В созданный каталог сохраняем этот файл.
4. Запускаем Opera и удовлетворенно смотрим на полученный результат 😉

Примечание: путь к файлу настроек в других операционных системах можно посмотреть, открыв в Opera эту ссылку.