关于grep,egrep以及fgrep,是我们Linux服务器中常用的文本过滤工具。掌握好这三个工具并结合正则表达式,对我们日后的运维工作有很大的帮助。1.grep,egrep,及fgrep区别。三者的主要区别在于对正则表达式的支持不同。首先,grep支持的是标准正则表达式;而egrep及grep -e则支持的是扩展正则表达式;至于fgrep,是不支持正则表达式的,在本文也就不再赘述。但是其在速度方面,相对前面两者,就比较快了,在精确匹配是就很好用。2.支持的常用选项
| 选项 | 作用 |
| --color=auto | 设置语法着色(可用alias默认使用) |
| -v | 反向选取 |
| -o | 仅显示匹配到的字符串 |
| -i | 不区分大小写 |
| -E(仅grep支持) | 使用扩展正则表达式 |
| -A # | 显示匹配到行及其前的#行 |
| -B # | 显示匹配到行及其后的#行 |
| -C # | 显示匹配到行及其前的#行和其后的#行 |
3.常用字符合集(注:可在正则表达式的字符匹配中结合[]或[^]使用)
[:digit:] 所有数字[:lower:] 所有小写字母[:upper:] 所有大些字母[:space:] 空白字符[:punct:] 标点符号[:alpha:] 大写加小写字母[:alnum:] 所有字母加数字4.标准正则表达式的元字符(注:为了使效果更明显,已设置别名alias grep="grep --color=auto".所使用示例文件在文章最下方)
.:匹配任意单个字符
| [root@localhost ~]# grep "r..t" /etc/passwd root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologin |
[]:匹配指定范围内的任意单个字符
| [root@localhost ~]# grep "r[[:alpha:]].t" /etc/passwdroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin |
如上所示,[:alpha:]表示所有字母的集合,所以外边再加个[]就是所有小写字母其中的一个了。所以在第一次匹配的v/ftp也就因为第二个不是字母而没有匹配到了.[^]取反,也就是指定范围外的任意单个字符
| [root@localhost ~]# grep "r[^[:alpha:]].t" /etc/passwdftp:x:14:50:FTP User:/var/ftp:/sbin/nologin |
如上图,[:alpha:]表示所有字母的集合,所以外边再加个[^]就是非所有小写字母其中的一个。所以root就匹配不到,而v/ftp就匹配到了.
*:任意其前面的字符任意次
| [root@localhost ~]# grep “b*c” testbcbbcabbbc |
?:匹配其前字符零次或一次
| [root@localhost ~]# grep "b?c" testbcbbcabbbc |
{m,n}:匹配其前面的字符至少m,至多n次
| [root@localhost ~]# grep "b{2,3}c" test bbcabbbc |
{m}:匹配其前面的字符m次
| [root@localhost ~]# grep "b{2}c" test bbcabbbc |
{0,n}:表示匹配其前面的字符至多n此
| [root@localhost ~]# grep "b{0,2}c" test bcbbcabbbc |
{m,}:表示匹配其前面的字符至少m次
| [root@localhost ~]# grep "b{3,}c" test abbbc |
^:锚定每行的起始位置
| [root@localhost ~]# grep "^bc" test bcbbc |
$:锚定每行的结束位置
| [root@localhost ~]# grep "bc$" test bcbbcabbbc |
<:锚定词首
| [root@localhost ~]# grep "<cd" test1ab.cd.ef |
>:锚定词尾 注:不包含特殊字符组成的串叫单词
| [root@localhost ~]# grep "b>" test1ab.cd.ef |
:等同于<或>,在单词左边为锚定词首,反之为锚定词尾
| [root@localhost ~]# grep "cd" test1ab.cd.ef[root@localhost ~]# grep "b" test1ab.cd.ef |
^$:没有任何字符的空白行
| [root@localhost ~]# grep "^$" test1 |
():可以将一串字符串引用起来,并可以结合次数匹配使用,也可以使用
进行引用
| [root@localhost ~]# grep "(abc){2}" test2abcabcabc[root@localhost ~]# grep "(a.c).*1" test2 #
表示引用第n个括号匹配到的内容,而非模式本身,所以 abczzzzzzzzzzza;c就没有被匹配到abcabcabcabczzzzzzzzzzzabca;czzzzzzzzzzza;c |
|:或者的意思
| [root@localhost ~]# grep "abc|def" test3abcefabdefabcdef[root@localhost ~]# grep "ab(c|d)ef" test3#或表示其前方的字符串或后面的字符串,而非单个字符,欲匹配单个字符,可以结合()使用abcefabdef |
5.扩展正则表达式关于扩展正则表达式的元字符大体上和标准正则表达式是一样的,只是在一些元字符使用时,不再需要使用进行转义,只有在使用词首锚定(<),词尾锚定(>)以及分组的引用(
)时转义,可以使模式更加简洁,可读性也会更强.同时也可以使用 + 表示匹配其前面的字符至少1次。-----------------------------------华丽的分割线--------------------------------------附:上述示例使用文件内容
| [root@localhost ~]# cat testbcbbcabbbc | [root@localhost ~]# cat test1ab.cd.efabcdefabde.ef |
| [root@localhost ~]# cat test2abcabcabcabcabczzzzzzzzzzzabca;czzzzzzzzzzza;cabczzzzzzzzzzza;c | [root@localhost ~]# cat test3abcefabdefabcdef |
Linux正则表达式特性及BRE与ERE的区别 http://www.linuxidc.com/Linux/2014-03/99152.htmgrep使用简明及正则表达式 http://www.linuxidc.com/Linux/2013-08/88534.htm正则表达式的用法 http://www.linuxidc.com/Linux/2013-03/81897.htm正则表达式之零宽断言 http://www.linuxidc.com/Linux/2013-03/81897.htmLinux中正则表达式与文件格式化处理命令(awk/grep/sed) http://www.linuxidc.com/Linux/2013-03/81018.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-08/105380.htm