服务器中常用的文本过滤工具。掌握好这三个工具并结合正则表达式,对我们日后的运维工作有很大的帮助。
1、三者的主要区别在于对正则表达式的支持不同。
2、支持的常用选项
3、常用字符合集
(注:可在正则表达式的字符匹配中结合[]或[^]使用)
[:digit:] 所有数字
[:lower:] 所有小写字母
[:upper:] 所有大些字母
[:space:] 空白字符
[:punct:] 标点符号
[:alpha:] 大写加小写字母
[:alnum:] 所有字母加数字
4、标准正则表达式的元字符
(注:为了使效果更明显,已设置别名alias grep="grep --color=auto".所使用示例文件在文章最下方)
4.1 字符匹配
.:匹配任意单个字符
[root@localhost ~]# grep "r..t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[]:匹配指定范围内的任意单个字符
[root@localhost ~]# grep "r[[:alpha:]].t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
如上所示,[:alpha:]表示所有字母的集合,所以外边再加个[]就是所有小写字母其中的一个了。
所以在第一次匹配的v/ftp也就因为第二个不是字母而没有匹配到了.
[^]取反,也就是指定范围外的任意单个字符
[root@localhost ~]# grep "r[^[:alpha:]].t" /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
如上图,[:alpha:]表示所有字母的集合,所以外边再加个[^]就是非所有小写字母其中的一个。
所以root就匹配不到,而v/ftp就匹配到了.
4.2 次数匹配
*:任意其前面的字符任意次
[root@localhost ~]# grep “b*c” test
bc
bbc
abbbc
\?:匹配其前字符零次或一次
[root@localhost ~]# grep "b\?c" test
bc
bbc
abbbc
\{m,n\}:匹配其前面的字符至少m,至多n次
[root@localhost ~]# grep "b\{2,3\}c" test
bbc
abbbc
\{m\}:匹配其前面的字符m次
[root@localhost ~]# grep "b\{2\}c" test
bbc
abbbc
\{0,n\}:表示匹配其前面的字符至多n此
[root@localhost ~]# grep "b\{0,2\}c" test
bc
bbc
abbbc
\{m,\}:表示匹配其前面的字符至少m次
[root@localhost ~]# grep "b\{3,\}c" test
abbbc
4.3 位置锚定
^:锚定每行的起始位置
[root@localhost ~]# grep "^bc" test
bc
$:锚定每行的结束位置
[root@localhost ~]# grep "bc$" test
bc
bbc
abbbc
\<:锚定词首
[root@localhost ~]# grep "\<cd" test1
ab.cd.ef
\>:锚定词尾 注:不包含特殊字符组成的串叫单词
[root@localhost ~]# grep "b\>" test1
ab.cd.ef
\b:等同于\<或\>,在单词左边为锚定词首,反之为锚定词尾
[root@localhost ~]# grep "\bcd" test1
ab.cd.ef
[root@localhost ~]# grep "b\b" test1
ab.cd.ef
^$:没有任何字符的空白行
[root@localhost ~]# grep "^$" test1
4.4 分组,引用及或
\(\):可以将一串字符串引用起来,并可以结合次数匹配使用,也可以使用\n进行引用
[root@localhost ~]# grep "\(abc\)\{2\}" test2
abcabcabc
[root@localhost ~]# grep "\(a.c\).*\1" test2
#\n 表示引用第n个括号匹配到的内容,而非模式本身,所以abczzzzzzzzzzza;c就没有被匹配到
abcabcabc
abczzzzzzzzzzzabc
a;czzzzzzzzzzza;c
\|:或者的意思
[root@localhost ~]# grep "abc\|def" test3
abcef
abdef
abc
def
[root@localhost ~]# grep "ab\(c\|d\)ef" test3
#或表示其前方的字符串或后面的字符串,而非单个字符,欲匹配单个字符,可以结合\(\)使用
abcef
abdef
4.5 扩展正则表达式
关于扩展正则表达式的元字符大体上和标准正则表达式是一样的,只是在一些元字符使用时,不再需要使用\进行转义,只有在使用词首锚定(\<),词尾锚定(\>)以及分组的引用(\n)时转义,可以使模式更加简洁,可读性也会更强.同时也可以使用 + 表示匹配其前面的字符至少1次。
附:上述示例使用文件内容