g r e
p(全局正则表达式版本)允许对文本文件进行模式查找。如果找到匹配模式,
g r e p打印包含模式的所有行。g r e
p支持基本正则表达式,也支持其扩展集。g r e
p有三种变形,即:
G r e
p:标准g r e
p命令,本章大部分篇幅集中讨论此格式。
E g r e
p:扩展g r e
p,支持基本及扩展的正则表达式,但不支持
q模式范围的应用,与之相对应的一些更加规范的模式,这里也不予讨论。
F g r e
p:快速g r e
p。允许查找字符串而不是一个模式。不要误解单词f
a s t,实际上它与g r e p速度相当。
grep
g r e
p一般格式为:
grep
[选项]基本正则表达式[文件]
这里基本正则表达式可为字符串。
双引号引用
在g r e
p命令中输入字符串参数时,最好将其用双引号括起来。例如:“m
y s t r i n
g”。这样做有两个原因,一是以防被误解为s h e l
l命令,二是可以用来查找多个单词组成的字符串。
在调用变量时,也应该使用双引号,诸如: g r e
p“$ M Y VA
R”文件名,如果不这样,将没有返回结果。
在调用模式匹配时,应使用单引号。
grep选项
常用的g r e p选项有:
-c
只输出匹配行的计数。
-i
不区分大小写(只适用于单字符)。
-h
查询多文件时不显示文件名。
-l
查询多文件时只输出包含匹配字符的文件名。
-n
显示匹配行及行号。
-s
不显示不存在或无匹配文本的错误信息。
-v
显示不包含匹配文本的所有行。
查询多个文件
如果要在当前目录下所有. d o c文件中查找字符串“
s o r t”,方法如下:
$ grep
"sort" *.doc
行匹配
$ grep -c
"48" data.f
$ 4
g r e
p返回数字4,意义是有4行包含字符串“4 8”
行数
显示满足匹配模式的所有行行数:
grep -n "48"
data.f
显示非匹配行
显示所有不包含4 8的各行:
grep -v "48"
data.f
精确匹配
使用g r e
p抽取精确匹配的一种更有效方式是在抽取字符串后加
>。假定现在精确抽取4
8,方法如下:
grep '48>' data.f
大小写敏感
缺省情况下, g r e
p是大小写敏感的,如要查询大小写不敏感字符串,必须使用-
i开关。d a t a . f文件中有月份字符S e p
t,既有大写也有小写,要取得此字符串大小写不敏感查询,方法如下:
grep -i "sept" data.f
grep和正则表达式
使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选择。使用正则表达式时最好用单引号括起来,这样可以防止g
r e p中使用的专有模式与一些s h e l
l命令的特殊方式相混淆。
模式范围
假定要抽取代码为4 8 4和4 8
3的城市位置,上一章中讲到可以使用[
]来指定字符串范围,这里用4
8开始,以3或4结尾,这样抽出4 8 4或4 8 3。
grep
'48[34]' data.f
不匹配行首
如果要抽出记录,使其行首不是4
8,可以在方括号中使用^记号,表明查询在行首开始。
grep
'^[^48]' data.f
设置大小写
使用-
i开关可以屏蔽月份S e p
t的大小写敏感,也可以用另一种方式。这里使用[
]模式抽取各行包含S e p t和s e p t的所有信息。
grep
'[Ss]ept' data.f
匹配任意字符
如果抽取以L开头,以D结尾的所有代码,可使用下述方法,因为已知代码长度为5个字符:
grep 'K...D' data.f
范围组合
grep
'[0-9][0-5][0-6]' data.f
模式出现机率
抽取包含数字4至少重复出现两次的所有行,方法如下:
grep
'4{2,}' data.f
使用grep匹配“与”或者“或”模式
g r e
p命令加-
E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2
1 9或2 1 6,方法如下:
grep -E
'219|216' data.f
匹配特殊字符
查询有特殊含义的字符,诸如$ . ' " * [] ^ | + ?
,必须在特定字符前加。
grep '.'
myfile
查询格式化文件名
使用正则表达式可匹配任意文件名。系统中对文本文件有其标准的命名格式。
grep
'[a-z]{1,6}.[A-Z]{1,2}' filename.deposit
类名
g r e
p允许使用国际字符模式匹配或匹配模式的类名形式。
类名及其等价的正则表达式
[ [ : u p p
e r : ] ] [ A - Z
]
[ [ : a l n u m : ] ] [ 0 - 9 a - zA-Z]
[ [ : l o w
e r : ] ] [ a - z
]
[ [ : s p a c e : ] ] 空格或t a b键
[ [ : d i g
i t : ] ] [ 0 - 9
]
[ [ : a l p h a : ] ] [ a - z A - Z ]
g r e
p中通配符*的使用
使用grep
'l.*s' testfile 可匹配 looks likes
系统grep命令
系如果要查询目录列表中的目录,方法如下:
ls -l | grep
'^d'
如果在一个目录中查询不包含目录的所有文件,方法如下:
ls -l | grep
'^[^d]'
使用g r
e p命令- s开关,可屏蔽错误信息。
如果g r
e p命令不支持- s开关,可替代使用以下命令:
grep
"louise" /etc/passwd > /dev/null
2>&1
脚本含义是匹配命令输出或错误( 2 > $
1),并将结果输出到系统池。大多数系统管理员称/
d e v / n u l
l为比特池,没关系,可以将之看成一个无底洞,有进没有出,永远也不会填满。
egrep
e g r e
p代表e x p r e s s i o n或extended grep,适情况而定。e g
r e p接受所有的正则表达式, e g r e
p的一个显著特性是可以以一个文件作为保存的字符串,然后将之传给e
g r e p作为参数,为此使用- f开关。
egrep -f
grepstrings data.f
当匹配大量模式时, -
f开关很有用,而在一个命令行中敲入这些模式显然极为繁琐
如果要查询存储代码3 2 L或2 C
C,可以使用(|)符号,意即“|”符号两边之一或全部。
egrep
'{32L|2CC}' data.f
可以使用任意多竖线符“ |”,
who | egrep
(louise|matty|qauline)
还可以使用^符号排除字符串。如果要查看系统上的用户,但不包括m
a t t y和p a u l i n e,方法如下:
who | egrep
-v '^(matty|pauline)'
如果要查询一个文件列表,包括s h u t d o w n、s h u t
d o w n s、r e b o o t和r e b o o t s,使用e g r e
p可容易地实现。
egrep
'(shutdown|reboot)(s)?' *