按照我喜欢的配置设置的grep程序。
项目描述
我编写grin是为了帮助我在充满源代码的目录中进行搜索。尊贵的GNU grep 和 find 是非常好的工具,但它们在我的常规用例中略逊一筹。
我对GNU grep 的主要问题是我无法排除我知道没有任何有趣内容的目录,例如 .svn/、CVS/ 和 build/。这些目录的结果掩盖了我真正感兴趣的结果。有像 ack 这样的工具可以跳过这些目录,但 ack 也只搜索它已知扩展名的文件。此外,它尚未实现上下文行功能,这是我逐渐习惯的功能。最近的发展已经添加了这些功能,但我在发布grin之前就发现了。
可以构建一个排除 .svn/ 及其他目录的 GNU find 命令,但我所知道的唯一可靠的方法是在每个文件上独立运行 grep。调用多个单独的 grep 进程的开销相对较大。
此外,我也感到无聊。这似乎正在流行起来。Perl 有 ack,Ruby 有 rak,现在 Python 有了 grin。
我编写 grin 是为了得到我想要的确切功能
默认递归目录。
不进入具有指定名称的目录。
不搜索具有指定扩展名的文件。
能够显示匹配行前后上下文行。
Python 正则表达式语法(有人可能会争论这究竟是功能还是我在使用实现语言提供的正则表达式库时的懒惰,但作为一个 Python 程序员,这是我最熟悉的语法)。
除非通过命令行选项抑制,否则无论文件数量多少,都显示文件名。
接受包含换行符分隔的文件名的文件(或 stdin)。这允许使用 find 很容易地给 grin 传递可能包含空格的文件名列表。
通过 gzip 压缩的文本文件进行 grep。
作为库,快速构建自定义工具非常有用。
我还将目录递归逻辑作为向 find 表示敬意而命令行工具“grind”。它将通过目录匹配 glob 模式递归,并打印出匹配项。它使用与 grin 相同的目录和文件扩展名跳过设置。
对于配置,您可以指定环境变量 GRIN_ARGS 和 GRIND_ARGS。这些应只包含各自程序的命令行选项。这些将被添加到实际给出的命令行参数之前。较后给出的选项将覆盖较早给出的选项,因此所有显式在命令行中给出的选项都将覆盖环境变量中的选项。例如,如果我想默认为两行上下文且不跳过目录,我会在我的 bashrc 中添加以下行
export GRIN_ARGS="-C 2 --no-skip-dirs"
安装
使用 pip 安装
$ pip install grin
运行单元测试需要 nose 框架
$ pip install nose ... $ nosetests ......................... ---------------------------------------------------------------------- Ran 25 tests in 0.192s OK $ python setup.py test # The other way to run the tests. running test ... etc.
开发源代码托管在 Github 上
在安装过程中有一个小调整你可能想要考虑。默认情况下,setuptools 间接安装脚本;安装到 $prefix/bin 或 PythonScripts 的脚本使用 setuptools 的 pkg_resources 模块加载安装脚本的 grin egg 的确切版本,然后运行脚本的 main() 函数。这通常不是什么坏功能,但可能会为像 grin 这样的小型命令行工具添加大量的启动开销。如果你想使 grin 的响应更快捷,我建议安装自定义脚本,这些脚本仅导入 grin 模块并运行适当的 main() 函数。请参阅 examples/grin 和 examples/grind 文件中的示例。
使用 grin
递归搜索当前目录的 regex
$ grin some_regex
搜索一组显式文件
$ grin some_regex file1.txt path/to/file2.txt
递归搜索一组显式目录
$ grin some_regex dir1/ dir2/
搜索通过 stdin 管道的数据
$ cat somefile | grin some_regex -
使 regex 不区分大小写
$ grin -i some_regex
在匹配前后显示 2 行上下文
$ grin -B 2 some_regex $ grin -A 2 some_regex $ grin -C 2 some_regex
仅搜索 Python .py 文件
$ grin -I "*.py" some_regex
抑制默认打印的行号
$ grin -N some_regex
仅显示包含匹配的文件名,而不是匹配本身
$ grin -l some_regex
抑制颜色突出显示的使用
# Note that grin does its best to only use color when it detects that it is # outputting to a real terminal. If the output is being piped to a file or # a pager, then no color will be used. $ grin --no-color some_regex
强制在将输出管道传输到能够理解ANSI颜色转义序列的某物时使用颜色高亮显示
$ grin --force-color some_regex | less -R
避免递归进入名为CVS或RCS的目录
$ grin -d CVS,RCS some_regex
默认情况下,grin跳过大量文件。要抑制所有这些行为并搜索一切
$ grin -sbSDE some_regex
搜索比some_file.txt更新的文件
# If no subdirectory or file in the list contains whitespace: $ grin some_regex `find . -newer some_file.txt` # If a subdirectory or file in the list may contain whitespace: $ find . -newer some_file.txt | grin -f - some_regex
使用grind
在当前目录或任何子目录中查找匹配glob“foo*.py”的文件,使用与grin相同的默认规则
$ grind "foo*.py"
抑制所有默认规则,在搜索时不跳过任何文件或目录
$ grind -sbSDE "foo*.py"
找到所有默认规则未跳过的文件
$ grind
在特定的目录集而不是当前目录中开始搜索(不是–分隔符)
$ grind --dirs thisdir that/dir -- "foo*.py"
将grin作为库使用
我在编写grin时的一个目标是可以将其用作库来编写自定义工具。您可以在examples/grinimports.py中看到一个我快速编写的示例。它重用了grin的大部分基础设施,除了它预处理Python文件以提取和规范化仅导入语句。这可以让您方便且稳健地搜索导入语句。查看“grinimports.py –help”获取更多信息。
examples/grinpython.py允许您遍历Python文件并指定您是否要搜索实际的Python代码、注释或字符串字面量,可以是任何组合。例如
$ grinpython.py -i --strings grep grin.py grin.py: 188 : """ Grep a single file for a regex by iterating over the lines in a file. 292 : """ Do a full grep. ... $ grinpython.py -i --comments grep grin.py grin.py: 979 : # something we want to grep. $ grinpython.py -i --python-code grep grin.py grin.py: 187 : class GrepText(object): 291 : def do_grep(self, fp): ...
同样,应该可以轻松编写这样的小工具,它从二进制文件中提取和搜索文本元数据。
待办事项
找出grep UTF-8、UTF-16和UTF-32 Unicode文本文件的故事。
Python 3
错误和类似问题
请在Github问题跟踪器中创建一个新的问题。
项目详情
grin-1.3.0.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | a8e5a1cc9461322be76cee9bd91fd546d64bbb2fd78dce8acaea9c424ade0db2 |
|
MD5 | 5367910dc2ac71414778fd08b5fc54b6 |
|
BLAKE2b-256 | 72135ada6822828e83b90571ea49a75d3ff5dd8cf3ea960ce453c45004220848 |