如果想通过使用grep命令来实现理想化的文本搜索,对正则表达式的了解是比不可少的。对正则表达式语法做了一个简单的介绍,提供了一个简单的入门。码农也可以自己google一下其他的参考资料。下面就grep命令的使用做个入门级的介绍。
linux下除了grep命令可以完成文本搜索外,还存在egrep,fgrep,rgrep三个命令。这三个命令都是由grep加上一些控制参数演变而来,如egrep=grep -e, fgrep=grep -f, rgrep=grep -r(后面会介绍这些参数),所以以码农只需关注于grep命令即可。
(1)grep [options] pattern [file...]
(2)grep [options] [-e pattern | -f pattern] [file...]
示例:
-e, --extended-regexp 将pattern作为扩展的正则表达式解释,如grep -e ‘^\s‘ hello.c // 搜索hello.c文件中以空白字符开始的行,相当于egrep ‘^\s‘
hello.c
-f, --fixed-strings 将pattern解释为固定的字符串,不作正则表达式分析。grep -f ‘main()‘ hello.c // 等同于fgrep ‘main()‘ hello.c
-e pattern, --regexp=pattern 指定pattern为搜索正则表达式,可以通过使用这个选项来指定多个搜索模式,或者用来制定以横线-开始的搜索模式,如grep -e hello -e world hello.c //搜索含有hello或者world的代码行
-f file, --file=file 指定从文件file中读取搜索模式,一行一个搜索模式
-i, --ignore-case模式匹配时忽略大小写
-v, --invert-math 反向匹配,选择那些不含有匹配模式的行,如grep -e -v hello hello.c //输出那些不含有hello的代码行
-x, --line-regexp 将一整行文本与搜索模式pattern进行匹配,输出匹配行,如grep -e ‘^\s*$‘ -x hello.c //查找空白行
-c, --count代替输出匹配的文本行,还是输出匹配的次数
-m num, --max-count=num 在一个文件中匹配次数超过num后,就停止搜索匹配
-o, --only-matching 代替输出匹配的文本行,而是仅仅输出匹配的部分文本
-n, --line-number 在输出的匹配文本行前面添加行号,这个行号指的原文件中的文本所在行号
-r, -r, --recursive 递归地从目录下的每个文件搜索匹配pattern,如grep -r hello . -n 10 //在当前目录下的每个文件(包括子目录中的文件)搜索单词hello,当在一个文件中匹配次数超过10次时,立即退出当前文件,对下一个文件进行搜索匹配
-d action, --devices=action 如果搜索文件是一个目录,使用action来处理它。action是read时,将目录文件当作普通文件;是skip时,将目录文件跳过;是recurse时,则递归地读取目录下的所有文件;grep
hello -d recurse . //相当于grep hello -r .
注:rgrep hello . = grep hello -r . = grep hello -d recurse .
参考文献:
文献1:http://msdn.microsoft.com/zh-cn/library/ae5bf541(v=vs.90).aspx
文献2:http://regex.bastardsbook.com/
文献3:http://my.oschina.net/wenhaowu/blog/219956
附上手册: