最近看到 golang
语法中一个非常有趣的基本组合 chan chan
,为了加深自己的理解,想多看几个使用案例,于是去 $GOPATH
下面的文件去找,但是一个个文件找肯定不现实,于是借助 grep
帮我们进行搜索,grep
的使用非常简单,但是如果在不了解 grep
使用的情况下,自己实现一个类似的搜索功能应该也不是很难,今天就让我们来看看 grep
的使用和 golang
版本的简单实现吧。
/usr/bin/grep
grep
命令的基本语法如下所示。
1 | $ grep 'chan' file |
除了列出文件名之外,我们还可以使用通配符搜索当前目录中所有文件。
1 | $ grep 'chan chan' * |
search sub directories recursively using grep
使用 grep
加上 -r
或者 -R
选项可以递归搜索当前目录下的所有文件。
1 | $ grep -r 'chan chan' * |
examples
例如,以下命令将会输出当前目录中所有文件及其所有子目录中包含单词 chan chan
的每一行。
1 | $ grep -r 'chan chan' * |
my own grep
如果要自己实现,在不考虑性能的情况下, 只需要实现两个功能,一是文件夹的递归遍历,二就是模式匹配,下面我们实现一个最简单的 grep
。
1 | var ( |
depth first search
我们利用深度优先搜索来遍历相关文件,如果当前对应的 path
为目录( file.Mode().IsDir()
),则递归调用搜索方法,如果 path
为普通文件( file.Mode().IsRegular()
),则利用下面的 grep
方法扫描该文件。直到所有文件均被遍历。
1 | func dfs(path, search string) { |
grep individual using scanner
对于每一个 fullpath
对应的文件,我们利用 bufio.NewScanner
构建一个扫描仪,并进行逐行扫描,然后判断要搜索的文字( search
)是否存在于该行中,如果存在( strings.Contains
),则在命令行中输出。
1 | func grep(fullpath, search string) { |