摘要:在我平时比较喜欢去的网站之中,GNU (http://www.gnu.org)是其中之一。其中的FSF/UNESCO Free Software Directory (http://www.gnu.org/directory/)就像一个深不见底的宝库,蕴藏了无以计数的优秀软件,其中有些软件已经成为我日常开发过程中不可或缺的利器,例如Emacs、grep等,今天我想给大家介绍的就是grep (Global Regular ExPression)——一款极其强大的文档搜索工具。
?
在Grep的首页上(http://www.gnu.org/software/grep),关于grep的介绍只有这么简单的一句:
?
Grep searches one or more input files for lines containing a match to a specified pattern. By default, grep prints the matching lines.
?
简单说来,你可以用grep来查找位于某个文件中的某个字符串,并可以控制结果显示。在阅读源代码时,grep几乎是必不可少的工具。通过它你可以非常快速地找到一个大型项目的入口,并能轻松地在海量源代码之间找到你所需的函数或变量。
?
下面我来举个简单的例子:我想查询所有位于当前目录下的.cs文件中的Main,通过grep我可以轻松快速地完成这项任务,命令如下:
?
grep ‘
Main’ *.cs
?
我机器上的示例输出结果为:
?
ChineseDemo.cs:??? public static void
Main()
RegDemo1.cs:????? static void
Main(string[] args)
RegDemo2.cs:??? public static void
Main()
RegDemo3.cs:?? ?public static void
Main()
?
可见,通过grep真的可以找到相关目录中符合条件的所有文件,并能打印出查询到的字符串所位于的那行内容。如果我只想确定哪些文件含有Main,而不需打印相应行的内容,那么可以使用以下命令:
?
grep –l ‘
Main’ *.cs
?
输出结果为:
?
ChineseDemo.cs
RegDemo1.cs
RegDemo2.cs
RegDemo3.cs
?
只有相应的文件名称被显示。
?
在找到了含有Main字符串的几个文件后,我想粗略地查看某一具体文件的里源代码的相关信息,比如查看RegDemo1.cs文件中含有Main这一行的前后三行,相关的命令如下:
?
grep –C 3 ‘Main’ RegDemo1.cs
?
输出结果为:
?
?
class GroupingApp
? {
????? static void
Main(string[] args)
????? {
????????? Reg7();
????? }
?
输出结果完全符合我的需求,static void Main(string[] args)这一行前后三行范围内的所有代码被全部打印出来(第一行是空行)。
?
以上的查询字符串没有对查找结果是否为一个完整的单词进行限制,也就是说TheMain和Main_Func都会被认定为查询目标。如果我想限定该查询字符串为一个完整单词,那么可以使用\w参数,相关命令如下:
?
grep –w ‘
Main’ *.cs
?
结果为:
?
ChineseDemo.cs:??? public static void
Main()
RegDemo1.cs:????? static void......[
阅读全文]