Статьи

Power Search с использованием UNIX grep

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 . Они просто занимают место и циклы процессора.