
Обёртка вокруг grep, помогающая искать что-либо с помощью grep
Обёртка над grep, позволяющая не вводить типовые шаблоны вручную.
Я использую grep постоянно. При аудите кодовых баз, просмотре вывода meg или просто при работе с большими объёмами данных. Я часто в итоге использую довольно сложные шаблоны, например такой:
▶ grep -HnrE '(\$_(POST|GET|COOKIE|REQUEST|SERVER|FILES)|php://(input|stdin))' *
Всё это очень легко напортачить при наборе, и бывает сложно понять, почему нет результатов: потому что находить нечего, или потому что вы ошиблись при написании шаблона или выбрали не те флаги.
Я написал gf, чтобы дать имена комбинациям шаблонов и флагов, которые я использую постоянно. Так что приведённая выше команда становится просто:
▶ gf php-sources
Определения шаблонов хранятся в ~/.gf в виде небольших JSON-файлов, которые можно держать под системой контроля версий:
▶ cat ~/.gf/php-sources.json
{
"flags": "-HnrE",
"pattern": "(\\$_(POST|GET|COOKIE|REQUEST|SERVER|FILES)|php://(input|stdin))"
}
Чтобы немного уменьшить длину и сложность шаблона, можно также указать список из нескольких шаблонов:
▶ cat ~/.gf/php-sources-multiple.json
{
"flags": "-HnrE",
"patterns": [
"\\$_(POST|GET|COOKIE|REQUEST|SERVER|FILES)",
"php://(input|stdin)"
]
}
В каталоге examples есть ещё несколько примеров файлов шаблонов.
Вы можете использовать флаг -save, чтобы создавать файлы шаблонов из командной строки:
▶ gf -save php-serialized -HnrE '(a:[0-9]+:{|O:[0-9]+:"|s:[0-9]+:")'
В комплекте идёт скрипт автодополнения, так что вы можете нажать 'tab', чтобы увидеть доступные варианты:
▶ gf <tab>
base64 debug-pages fw php-curl php-errors php-sinks php-sources sec takeovers urls
Чтобы автодополнение заработало, нужно выполнить source файла gf-completion.bash в вашем .bashrc или аналогичном файле:
source ~/path/to/gf-completion.bash
Чтобы автодополнение заработало, нужно включить автодополнение (не требуется, если у вас oh-my-zsh) с помощью autoload -U compaudit && compinit или добавив это в .zshrc
Затем выполните source файла gf-completion.zsh в вашем .zshrc или аналогичном файле:
source ~/path/to/gf-completion.zsh
Примечание: если вы используете oh-my-zsh или подобное, вы можете обнаружить, что gf является алиасом для git fetch. Вы можете либо создать алиас для бинарника gf под другим именем, либо выполнить unalias gf, чтобы удалить алиас git fetch.
Существуют отличные движки поиска по коду, которые могут стать лучшей заменой grep. Хороший пример — the silver searcher. Он быстрее (реально намного быстрее) и представляет результаты в более наглядном виде. Чтобы использовать другой движок, добавьте engine: <other tool> в соответствующий файл шаблона:
# Using the silver searcher instead of grep for the aws-keys pattern:
# 1. Adding "ag" engine
# 2. Removing the E flag which is irrelevant for ag
{
"engine": "ag",
"flags": "-Hanr",
"pattern": "([^A-Z0-9]|^)(AKIA|A3T|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{12,}"
}
E нужно удалить из файла aws-keys.json, чтобы ag успешно запустился.Если у вас установлен и настроен Go, вы можете установить gf следующей командой:
▶ go get -u github.com/tomnomnom/gf
Если вы устанавливали с помощью go get, вы можете включить автодополнение в вашем .bashrc так:
▶ echo 'source $GOPATH/src/github.com/tomnomnom/gf/gf-completion.bash' >> ~/.bashrc
Учтите, что вам придётся перезапустить терминал или выполнить source ~/.bashrc, чтобы изменения вступили в силу.
Чтобы быстро начать работу, вы можете скопировать примеры файлов шаблонов в ~/.gf так:
▶ cp -r $GOPATH/src/github.com/tomnomnom/gf/examples ~/.gf
Мои личные шаблоны, которые я включил в качестве примеров, могут оказаться не очень полезными для вас, но, надеюсь, они послужат разумной отправной точкой.
На самом деле мне больше всего интересны новые файлы шаблонов! Если у вас есть что-то, что вы регулярно ищете с помощью grep, смело открывайте PR, чтобы добавить новые файлы шаблонов в каталог examples.
Исправления ошибок также приветствуются, как всегда :)