头一低,很多年都这样过去了...

欢迎来到Kittow的部落格! - http://blog.skyhe.com

Agile Web Development (敏捷Web开发)

Want to Know Something More? Move Your Mouse Here;)

我是天空的一片云,偶尔投影在你的波心,你记得也好,最好你忘掉,你我在交汇时,互放的光亮。
——徐志摩《偶然》 More...

我的VOA听写积分

2005-6-30 [返回]
介绍一款强大的文档搜索工具 - grep
感觉自己真实知漏寡闻,以前竟然没有听说过grep(Global Regular ExPression)。
今天在翻看Tiny的blog中看到 用正则表达式和grep对网站日志进行分析 这篇文章。感觉grep是设么呢?我就去google中搜索了一下(google再次证明了他的伟大),看到了下面的一篇文章,感觉讲的不错,我就引用下来,方便以后查阅。介绍一款强大的文档搜索工具——grep


在我平时比较喜欢去的网站之中,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 Main(string[] args)

RegDemo2.cs:??? public static void Main()

RegDemo3.cs:??? public static void Main()

?

注意:Main后面的开始括号不会被grep内嵌的正则表达式处理引擎认定为单词。

?

以上的查询只是基于单个字符串的简单查询,grep最强大之处就是可以直接使用正则表达式,从而可以完成极尽复杂的各种查询操作。比如下面的这个简单命令就是查询所有当前目录下.cs文件中的以arg开头的字符串:

?

grep –e ‘arg[\S]*’ *.cs

?

输出结果为:

?

RegDemo.cs:????? private string arg;

RegDemo.cs:????? public static void Main(string[] args)

RegDemo.cs:????????? foreach(string arg in args)

RegDemo.cs:????????????? Console.WriteLine(arg);

RegDemo1.cs:????? static void Main(string[] args)

?

OK,关于grep的使用方法就先简单介绍到这里。大家如果感兴趣可以到grep的主(http://www.gnu.org/software/grep/)去查找相关文档,也可以到GNU ftp (ftp://ftp.gnu.org/gnu/grep/) 去下载源代码并编译,目前最新版本为2.5。不过,对于大多数Windows开发人员来说,机器上可能并没有相应的make环境,因此可能要换用以下两种方法来实现:

?

1.?????? 安装并配置Cygwin (http://www.cygwin.com),在选择安装组件的时候选中grep即可。安装完成后,记得把\Cygwin\bin目录添加至PATH变量。我所采用的就是这种方法,配置后我可以很方便地在Emacs或cmd里使用grep。

2.?????? 下载并安装第三方厂商为Windows平台开发的grep。目前我所知道的有两款:PowerGREP (http://www.powergrep.com)和Windows Grep (http://www.wingrep.com)。这两款工具我并未用过,大家可以查看相应的文档以决定是否使用。

?

转自:天河网 | www.skyhe.com

Posted at 11:43 AM | Comments[0]

转自:天河网 | www.skyhe.com

发表评论
We Used Ajax to Post Your Comment!
本站评论系统采用Ajax技术,无刷新发送评论
您的大名 *   
电子邮件  
5+6=? *(请输入“5+6=?”的结果)
评论内容 *