Friday, January 20, 2012

Поиск файла с нужным содержимым в shell/bash


Что бы быстро найти файлы, внутри которых находится искомый набор символов, в *nix системах есть замечательная утилита grep

Если, к примеру, нам надо найти все файлы содержащие МАСКУ_ПОИСКА и находящиеся в текущей директории и во всех вложенных, то надо дать такую команду:


grep МАСКА_ПОИСКА * -R


Это сработает почти везде, кроме SunOS (Solaris). 

Разработчики этой операционной системы (SunOS) почему-то посчитали что у ихнего grep функция рекурсивного поиска файлов совсем не обязательна. Но безвыходных ситуаций не бывает - воспользуемся find. Ниже приведенный пример выполняет поиск файлов и выводит их имена, если содержимое соответствует МАСКЕ_ПОИСКА

find . -type f -exec grep -l МАСКА_ПОИСКА \{\} \;

Для любознательных ниже представлен полный перечень опций grep для стандартных (не SunOS) систем.

Использование: grep [OPTION]... PATTERN [FILE] ...
Ищет PATTERN в каждом FILE или стандартном вводе.
Пример: grep -i 'hello world' menu.h main.c

Выбор типа регулярного выражения и его интерпретация:
-E--extended-regexpPATTERN - расширенное регулярное выражение
-F--fixed-regexpPATTERN фиксированная строчка, разделенная концами строк
-G--basic-regexpPATTERN простой регулярное выражение
-P--perl-regexpPATTERN регулярное выражения языка Perl

Выбор типа регулярного выражения и интерпретации:
-e--regexp=PATTERNиспользовать PATTERN как регулярное выражение
-f--file=FILEбрать PATTERN из FILE'а
-i--ignore-caseигнорировать раличие регистров
-w--word-regexpPATTERN должен подходить ко всему слову
-x--line-regexpPATTERN должен подходить ко всей строке
-z--null-dataстрочки оканчиваются на байт 0, а не на конец строки

Разноообразные:
-s--no-messagesподавлять сообщения об ошибках
-v--revert-matchвыбирать не подходящие строки
-V--versionнапечатать информацию о версии и выйти
--helpпоказать помощь и выйти
--mmapиспользовать mmap ввод по возможности

Управление выводом:
-m--max-count=NUMостановиться после NUM совпадений
-b--byte-offsetпечатать вместе с выходными строчками смещение в байтах
-n--line-numberпечатать номер строки вместе с выходными строчками
--line-bufferedсбрасывать буфера каждую строчку
-H--with-filenameпечатать имя файла для каждого совпадения
-h--no-filenameподавить вывод имени файла на выходе
--label=LABELвыводить LABEL вместо имени файла
-q--quiet, --silentподавить весь обычный вывод
--binary-files=TYPEсчитать что бинарный файл типа:
TYPE - 'binary', 'text', или 'without-match'
-a--textне подавлять бинарный вывод
-Iто же, что и --binary-files=without-match
-d--directories=ACTIONкак обрабатывать каталоги
ACTION может быть 'read' (читать),
'recurse' (рекурсивно), или 'skip' (пропускать)
-D--devices=ACTIONкак обрабатывать устройства, каналы и сетевые каналы
ACTION может быть 'read' или 'skip'
-R, -r--recursiveаналогично --directories=recurse.
--include=PATTERNобработать файлы, удовлетворяющие PATTERN
--exclude=PATTERNпропустить файлы, удовлетворяющие PATTERN
--exclude-from=FILEпропустить файлы, удовлетворяющиеPATTERN в FILE
-L--files-without-matchпечатать только имена файлов без совпадений
-l--files-with-matchesпечатать только имена файлов с совпадениями
-c--countпечатать только количество совпадающих строк на файл
-Z--nullпечатать байт 0 после имени файла

Управление контекстом:
-B--before-context=NUMпечатать NUM строк предшествующего контекста
-A--after-context=NUMпечатать NUM строк последующего контекста
-C--context[=NUM]печатать NUM строк контекста, если не перекрывается -A или -B
--color[=WHEN], --colour[=WHEN]использовать маркеры для различия совпадающих строк
WHEN может быть `always' (всегда), `never' (никогда) или `auto' (автоматически)
--color, --colourиспользовать маркеры для различия совпадающих строк
-NUMто же, что и --context=NUM
-U--binaryне удалять сиволы CR в конце строки (MSDOS)
-u--unix-byte-offsetsвыдавать смещение, как-будто нет CR-ов (MSDOS)