一个围绕 grep 的包装器,用于避免重复输入常见模式。
我经常使用 grep。在审计代码库、查看 meg 的输出,或者只是处理大量数据时,我最终经常会使用像这样相当复杂的模式:
▶ grep -HnrE '(\$_(POST|GET|COOKIE|REQUEST|SERVER|FILES)|php://(input|stdin))' *
在输入所有这些内容时很容易出错,而且你很难判断没有任何结果是因为确实没有可找到的内容,还是因为你写错了模式或选择了错误的标志。
我编写了 gf 来为我经常使用的模式和标志组合赋予名称。于是上面的命令变得很简单:
▶ gf php-sources
模式定义以小型 JSON 文件的形式存储在 ~/.gf 中,可以纳入版本控制:
▶ 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
要让自动补全工作,你需要在你的 .bashrc 或类似文件中 source 一下 gf-completion.bash 文件:
source ~/path/to/gf-completion.bash
要让自动补全工作,你需要使用 autoload -U compaudit && compinit 启用自动补全(如果你有 oh-my-zsh 则不需要),或者将其放入 .zshrc
然后在你的 .zshrc 或类似文件中 source 一下 gf-completion.zsh 文件:
source ~/path/to/gf-completion.zsh
注意:如果你使用 oh-my-zsh 或类似的工具,你可能会发现 gf 是 git fetch 的别名。你可以将 gf 二进制文件另起别名,或者使用 unalias gf 来移除 git fetch 别名。
市面上有一些很棒代码搜索引擎,可以作为 grep 的更好替代品。一个很好的例子是 the silver searcher。它更快(就是 快得多),并且以更直观易读的方式呈现结果。为了使用不同的引擎,请在相应的模式文件中添加 engine: <其他工具>:
# 使用 the silver searcher 代替 grep 来匹配 aws-keys 模式:
# 1. 添加 "ag" 引擎
# 2. 移除对 ag 无关紧要的 E 标志
{
"engine": "ag",
"flags": "-Hanr",
"pattern": "([^A-Z0-9]|^)(AKIA|A3T|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{12,}"
}
aws-keys.json 文件中移除 E 标志,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 目录。
一如既往,也欢迎 Bug 修复 :)