• grep(参数)选项。
• 匹配g r e p的一般模式。
• 只匹配字母或数字,或两者混用。
• 匹配字符串范围
8.1 grep
g r e p一般格式为:
grep [选项]基本正则表达式[文件]
这里基本正则表达式可为字符串。8.1.1 双引号引用
在g r e p命令中输入字符串参数时,最好将其用双引号括起来。例如: “m y s t r i n g” 。这样做
有两个原因,一是以防被误解为 s h e l l命令,二是可以用来查找多个单词组成的字符串,例如:
“jet plane ” ,如果不用双引号将其括起来,那么单词 p l a n e将被误认为是一个文件,查询结果
将返回“文件不存在”的错误信息。
在调用变量时,也应该使用双引号,诸如: g r e p“$ M Y VA R”文件名,如果不这样,将
没有返回结果。
在调用模式匹配时,应使用单引号
8.1.2 grep选项
常用的g r e p选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符) 。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
8.1.3 查询多个文件
8.1.4 行匹配
$ grep -c "48"data.f
$ 4
g r e p返回数字4,意义是有 4行包含字符串“4 8”
如果要在当前目录下所有 . d o c文件中查找字符串“ s o r t” ,方法如下:
$ grep "sort"*.doc
或在所有文件中查询单词“ sort it”
$ grep "sort it" *
现在讲述在文本文件中 g r e p选项的用法
8.1.5 行数
显示满足匹配模式的所有行行数:
$ grep -n "48" data.txt
8.1.6 显示非匹配行
显示所有不包含4 8的各行:
$ grep -v "48" data.txt
8.1.7 精确匹配
可能大家已注意到,在上一例中,抽取字符串“ 4 8” ,返回结果包含诸如 4 8 4和4 8 3等包含
“4 8”的其他字符串,实际上应精确抽取只包含 4 8的各行。注意在每个匹配模式中抽取字符串
后有一个< Ta b >键,所以应操作如下:
$grep "48<tab>" data.txt
< Ta b >表示点击t a b键。
使用g r e p抽取精确匹配的一种更有效方式是在抽取字符串后加 \ > 。假定现在精确抽取 4 8,
方法如下:
$ grep '48\>' data.txt
8.1.8 大小写敏感
缺省情况下, g r e p是大小写敏感的,如要查询大小写不敏感字符串,必须使用 - i开关。在
d a t a . f 文件中有月份字符 S e p t,既有大写也有小写,要取得此字符串大小写不敏感查询,方法
如下:
8.2 grep和正则表达式
$ grep -i "sept" data.txt
8.2.1 模式范围
假定要抽取代码为 4 8 4和4 8 3的城市位置,上一章中讲到可以使用 [ ] 来指定字符串范围,这
里用4 8开始,以3或4结尾,这样抽出4 8 4或4 8 3。
$ grep '48[34]' data.txt
8.2.2 不匹配行首
如果要抽出记录,使其行首不是 4 8,可以在方括号中使用 ^记号,表明查询在行首开始
$ grep '^[^48]' data.txt
8.2.3 设置大小写
$grep '[Ss]ept' data.txt
8.2.4 匹配任意字符
如果抽取以 L开头,以 D结尾的所有代码,可使用下述方法,因为已知代码长度为 5个字
符:
$ grep 'K...D' data.txt
$ grep '[A-Z][A-Z]..C' data.txt
8.2.5 日期查询
一个常用的查询模式是日期查询。先查询所有以 5开始以1 9 9 6或1 9 9 8结尾的所有记录。使
用模式 5 . . 1 9 9 [ 6 , 8 ]。这意味着第一个字符为 5,后跟两个点,接着是 1 9 9,剩余两个数字是 6或
8。
$ grep "5...199[6,8]" data.txt
查询包含 1 9 9 8的所有记录的另外一种方法是使用表达式 [ 0 - 9 ] \ { 3 \ } [ 8 ] ,含义是任意数字重
复3次,后跟数字8,虽然这个方法不像上一个方法那么精确,但也有一定作用。
$ grep "[0-9]\{3\}[8]" data.txt
8.2.7 模式出现机率
抽取包含数字4至少重复出现两次的所有行,方法如下:
$ grep "4\{2,\}" data.txt
上述语法指明数字 4至少重复出现两次。
同样,抽取记录使之包含数字 9 9 9(三个9) ,方法如下:
$ grep '9\{3,\}' data.txt
如果要查询重复出现次数一定的所有行,语法如下,数字 9重复出现两次:
$ grep "9\{2\}" data.txt
8.2.9 空行
结合使用^和$可查询空行。使用 - n 参数显示实际行数:
$ grep "^$" data.txt
8.2.10 匹配特殊字符
查询有特殊含义的字符,诸如$ . ' " * [] ^ | \ + ? ,必须在特定字符前加\。假设要查询包含“.”
的所有行,脚本如下:
$ grep "\." data.txt
或者是一个双引号:
$ grep "\"" data.txt
以同样的方式,如要查询文件名 c o n f t r o l l . c o n f(这是一个配置文件) ,脚本如下
$ grep "conftroll\.conf" data.txt
8.4.1 目录
如果要查询目录列表中的目录,方法如下:
$ ls -l |grep "^d"
如果在一个目录中查询不包含目录的所有文件,方法如下:
$ ls -l |grep "^[^d]"
要查询其他用户和其他用户组成员有可执行权限的目录集合,方法如下:
$ ls -l |grep "^d.....x..x"