1.说明
2.基本概念
(1)grep(全局正则表达式版本)允许对文本文件进行模式查找,如果找到匹配模式,grep打印包含模式的所有行。grep支持基本正则表达式,也支持其扩展集。
一般格式:
grep [选项] 基本正则表达式 [文件]
//本文的测试用例
(2)常用的grep选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
例:
1.行匹配(输只出匹配行的计数)
$ grep -c "48" data.f
$ 4
2.行数(显示匹配行及行号)
$ grep -n "48" data.f
(3)grep和正则表达式:
双引号:在grep命令中输入字符串参数时,最好将其用双引号括起来。例如:“mystring”。
//这样做有两个原因,一是以防被误解为 shell命令,二是可以用来查找多个单词组成的字符串,例如:“jet plane”,如果不用双引号将其括起来,那么单词 plane将被误认为是一个文件,查询结果将返回“文件不存在”的错误信息。
//在调用变量时,也应该使用双引号,诸如:grep“$MYVAR”文件名,如果不这样,将没有返回结果。
单引号:
//在调用模式匹配时,应使用单引号。
使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选择。使用正则表达式时最好用单引号括起来,这样可以防止grep中使用的专有模式与一些shell命令的特殊方式相混淆。
例:
1.$grep '48[34]' data.f //483 484
2.$grep '^[^48]' data.f //行首不是48
3.$grep 'K...D' data.f //抽取以L开头,以D结尾的所有代码,可使用下述方法,因为已知代码长度为5个字符
4.$grep '[A-Z][A-Z]..C' data.f //头两个是大写字母,中间两个任意,并以C结尾
5.$grep '5..199[6,8]' data.f //先查询所有以5开始以1996或1998结尾的所有记录。使用模式5..199[6,8]
6.$grep '^[0-9][0-5][0-6]' data.f //以行首开始第一个字符为0到9之间,第二个字符在0到5之间,第三个字符在0到6之间
7.$grep -E '219|216' data.f //匹配“与”或者“或”模式,grep命令加-E参数,这一扩展允许使用扩展模式匹配
8.$grep 'conftroll\.conf' myfile //匹配特殊字符,查询文件名conftroll.conf
9.$grep '[0-9]\{3\}\.[0-9]\{3\}\.' ipfile //查看nnn.nnn网络地址
10.类名
//grep允许使用国际字符模式匹配或匹配模式的类名形式
类名及其等价的正则表达式
[[:upper:]] | [A-Z] |
[[:lower:]] | [a-z] |
[[:digit:]] | [0-9] |
[[:alnum:]] | [0-9a-zA-Z] |
[[:space:]] | 空格或tab键 |
[[:alpha:]] | [a-zA-Z] |
$grep '5[[:upper:]][[:upper:]]' data.f
(4)查询多个文件
例:
1.如果要在当前目录下所有.doc文件中查找字符串“sort”,方法如下:
$ grep "sort"*.doc
2.或在所有文件中查询单词“sort it”
$ grep "sort it" *
(5)命令行输出结果作为grep的"输入"
上诉的例子都是从文本文件抽取和过滤,下面的例子是以命令行输出作为操作对象。
$ps -ef | grep -v "grep" | grep "processname"
//目的:查看"processname"进程是否正在运行
//ps -ef,e:参数显示所以进程,f:全格式
//在grep命令中使用-v选项可丢弃ps命令中的grep进程
3.小结
如果要通过文件快速查找字符串或模式,并打印包含模式的所有行,grep是一个很好的选择。