UNIX grep — это командный инструмент для поиска текстовых строк внутри файлов. (Не следует путать это с находкой, которая соответствует именам файлов и свойствам). В этом посте есть некоторые советы, как использовать grep для быстрого и эффективного поиска файлов.
Пример поиска в дереве исходных текстов Plone примеров «content-core» в файлах шаблонов страниц
Некоторые заметки о grep
- Grep может искать несколько файлов и деревьев каталогов
- Grep можно настроить, чтобы быть быстрее
- Grep выход может быть дружелюбным и раскрашенным
Как и во многих инструментах UNIX, благодаря унаследованной и обратной совместимости, grep не делает все это из коробки и просто предоставляет простой интерфейс.
1. Установите GNU grep
GNU grep поддерживает множество опций, например, улучшенную окраску, по сравнению с BSD grep, который поставляется с операционными системами на основе BSD, такими как OSX. Вы можете установить GNU grep из пакета Macp для grep . Смотрите ztanesh README, например, команда sudo port install .
2. Поиск нескольких файлов
Ниже приведен пример того, как выполнять поиск без учета регистра (-i), рекурсивно (-R) из папки, включая только файлы (-include) .py. Т.е. он ищет во всех файлах Python в исходном дереве слово «foobar»:
grep -Ri --include="*.py" foobar ~/code/mixnap/krusovice-src
3. Использование цветов
Вы можете раскрасить вещи в выводе grep, такие как имя файла, номер белья, выделенное совпадение и линии вокруг результата.
Ниже приведен мой пример настройки переменной среды GREP_COLORS
GREP_OPTIONS="--color=always" GREP_COLORS="ms=01;37:mc=01;37:sl=:cx=01;30:fn=35:ln=32:bn=32:se=36"
Примечание. Используйте GREP_COLORS, а не устаревшую переменную среды GREP_COLOR, поскольку первая предоставляет гораздо больше опций.
4. Искать как ASCII
По умолчанию grep декодирует входящие текстовые файлы в кодировке, заданной в переменных среды. Это займет циклы процессора. Если вы ищете простое совпадение ASCII, как, например, в файлах исходного кода на языке программирования, вы можете получить большую скорость, отключив декодирование. Переопределить переменную среды LC_CTYPE при запуске grep :
LC_CTYPE=POSIX grep....
Это ошибка GNU grep, исправленная в 2.7 .
5. Показать линии вокруг матча
Вы можете указать параметры –before-context и –after-context , которые показывают фрагмент текста вокруг совпадающей строки. Также –line-number является очень полезным переключателем при работе с файлами исходного кода.
6. Поиск псевдонима оболочки ZSH
Это оборачивает все это вместе. Мы определяем функцию поиска ZSH, которая даст нам ярлык для поиска нескольких файлов в дереве папок:
# Search ASCII-string from multiple files in the currect working directory # E.g. # search "foobar" "*.html" # search "foobar" "*.html" myfolder # By default we excluse dotted files and directoves (.git, .svn) function search() { if [[ ! -n "$1" ]] ; then echo "Usage: search \"pattern\" \"*.filemask\" \"path\"" return fi # Did we get path arg if [[ ! -n "$3" ]] ; then search_path="." else search_path="$3" fi # LC_CTYPE="posix" 20x increases performance for ASCII search # https://twitter.com/jlaurila/status/86750682094374912 # We use specially tuned GREP colors - make sure you have GNU grep on OSX # https://github.com/miohtama/ztanesh/blob/master/README.rst GREP_COLORS="ms=01;37:mc=01;37:sl=:cx=01;30:fn=35:ln=32:bn=32:se=36" LC_CTYPE=POSIX \ grep -Ri "$1" --line-number --before-context=3 --after-context=3 --color=always --include="$2" --exclude=".*" "$search_path"/* }
Это и другие вкусности ZSH доступны в пакете ztanesh на Github .
7. Отключите собственную индексацию файлов ОС
Если вы используете grep в качестве основного инструмента поиска, я предлагаю вам отключить операции индексирования поиска операционной системы, такие как OSX Spotlight . Они просто занимают место и циклы процессора.