在Linux命令行下搜索文本关键字,大家第一时间肯定会想到grep命令。grep命令确实很强大,但是如果需要使用它更灵活的功能,命令可能会变得很复杂。因此,为了简化grep语句并达到同样的效果,业界很多专家开发了很多同样强大的工具,甚至可以在一定程度上替代grep。下面我就给大家介绍5个常用的命令行搜索工具。如果您不喜欢使用编辑器或IDE来查找代码关键字,那么这几个工具将对您有很大帮助。这5个工具中有一些只适用于类Unix系统,但也有一些非常快速的跨平台搜索工具。grep使用grep的好处是它几乎可以在任何类Unix系统上使用。相信大家都听说过这个命令的威力。下面给大家介绍一下我最常使用grep命令的一些方法。如果你只是想在py文件中查找关键字并输出行号,你可以这样做:$grep-rins--include\*.pyimport。假设前几天我们在命令行输入了一个比较复杂的命令,但是现在我们只回忆了其中的一部分命令。然后我们可以通过管道(|)使用grep命令来搜索历史命令:$history|grep"python"这个命令执行后,我们可以找到我们曾经运行过的所有包含python关键字的命令,然后我们可以通过!重新执行此命令。$history|grep"python"284pythontest.py...#省略其他结果$!284$pythontest.pyackack相对来说大家不是那么熟悉,是“一个类似grep,为程序员优化的工具”。它默认递归搜索,但忽略版本控制工具目录,例如.git目录。并且它自带了很多非常好用的工具,可以大大提高我们的搜索效率。我们再以上面的例子为例。接下来我们使用ack命令实现只在py文件中查找import关键字的方法:#ack命令实现方式$ackimport--py#grep命令实现方式$grep-rins--include\*.pyimport。上面是只在py文件中搜索,那如果我们要搜索除py文件类型以外的所有其他类型的文件呢?对于每种文件类型,都有一个相应的no标志,以排除对该文件类型的搜索。例如,如果要搜索py文件,请使用--py选项;如果要排除py文件,请使用--nopy选项。$ackimport--nopy当然文件类型有很多,我们也可以通过修改~/.ackrc文件来扩展文件类型。假设我们现在要搜索.conf文件,ack默认不支持:$ackhello--confUnknownoption:confack:Invalidoptiononcommandline要注册.conf文件类型,我们可以在~/.ackrc文件中添加以下内容,after我们可以正常搜索conf文件了。--type-set=conf=.conf配置文件修改后,我们可以通过--help-types选项来确认自定义类型是否添加成功。ack命令从.ackrc文件中获取配置信息,但是如果你想在没有.ackrc文件的情况下运行ack命令,你可以使用-noenv选项。SilverSearcher是另一个类似ack的grep替代品,因其更快的性能而备受推崇。它有一个非常有用的特性,就是它会忽略项目工程中.gitignore文件中指定的文件。所以如果你想从搜索中排除一些文件,你可以把这些文件写在.gitignore文件中。如果说silversearcher,你可能不是很熟悉,但它的另一个名字可能有点耳熟:ag命令。在Ubuntu系统上,可以使用如下命令安装ag命令:$apt-getinstallsilversearcher-ag使用ag命令搜索py文件中包含关键字import的内容:$agimport--pyag该命令非常好功能强大,限于篇幅,本文只介绍其最重要的基本用法,如果改天有时间,我将补充其其他非常强大的功能用法。siftsift是用Golang编写的grep替代品,这意味着它可以在Linux、Windows、OSX和其他系统上使用。它快得离谱,并且有一些很酷的用例来代替grep+awk组合来提取数据。然后我们使用sift命令搜索所有包含import关键字的py文件:#Onlysearchforpyfiles:sift--extpyimport#Excludepyfilessift--exclude-extpyimportRipGrepRipGrep类似于SilverSearcher,可以在Mac上运行,Linux和Windows上运行。它的自述文件声称RipGrep通常比任何其他搜索工具都快,它尊重Rust的正则表达式引擎,并使用像SilverSearcher这样的.gitignore文件来排除一些文件或目录。RipGrep通常缩写为rg,我们使用rg命令搜索所有包含import关键字的py文件:rg--type=pyimport总结命令行下有很多有用的搜索工具,正确使用这些工具会给我们带来工作效率大大提高。本文介绍5个常用的搜索工具,限于篇幅无法做深入介绍。更详细的介绍可以参考网上的一些文章,或者他们的manpages。后面会详细介绍每一个命令,记得关注哦~
