上一节我们介绍过grep命令在搜索文本信息时的基本用法,其实,grep命令还可以配合正则表达式执行更加复杂的搜索操作。

    上一节我们介绍过grep命令在搜索文本信息时的基本用法,其实,grep命令还可以配合正则表达式执行更加复杂的搜索操作。

    本节我们将对如何在Linux命令行中使用正则表达式进行介绍。

    所谓正则表达式,就是利用一些特殊符号构成的表达式,来模糊匹配字符串。下面是一些可用的正则表达式符号:

 符号   符号含义 
 .  匹配除了换行符以外的任意字符 
 ^  匹配一行的开始位置 
 $  匹配一行的结束位置 
 *  匹配零次或多次前面的字符或表达式
 \  对下一个字符进行转义,使其成为普通的字符,例如\^会将^转义,使其成为普通的^符号,而不再表示匹配一行的开始位置。
 []  中括号可以匹配括号内的任一字符,例如 [aeiou] 表示匹配a、e、i、o、u中的任意一个字符,如果要匹配范围的话,可以在中间加'-',例如:[0-9]表示匹配0到9的任一字符。
 ()  对正则表达式进行分组
 |  在分组中可以匹配|左侧的部分,或者匹配|右侧的部分
 ?  前面的字符可以存在,也可以不存在,例如a?bc表示匹配abc或者bc
 {n}  匹配n次前面的字符
 {n,m}  匹配最少n次,最多m次前面的字符
 {n,}  匹配最少n次前面的字符,可以超过n次

    下面我们举例来说明,我们先创建一个sample文件,并在sample中写入以下内容:

[root@localhost pcre_test]# cat sample
apple
bat
ball
ant
eat
pant
people
taste
[root@localhost pcre_test]# 

    我们先用grep查找包含字母a的文本行:

[root@localhost pcre_test]# cat sample | grep a
apple
bat
ball
ant
eat
pant
taste
[root@localhost pcre_test]# 

    可以看到,除了people所在的行,其他的包含字母a的文本行都匹配到了。接下来,我们用正则表达式来查找只以字母a开头的文本行:

[root@localhost pcre_test]# cat sample | grep ^a
apple
ant
[root@localhost pcre_test]# 

    通过 ^a 正则表达式,就只显示了以字母a开头的文本行。

    再比如,下面的例子,是利用正则表达式将以字母t结尾的文本行显示出来:

[root@localhost pcre_test]# cat sample | grep t$
bat
ant
eat
pant
[root@localhost pcre_test]# 

    我们再来看个比较复杂的例子,假设sample文件的内容如下:

[root@localhost pcre_test]# cat sample
+12345
1adfsf
-67890
sdfsefs
55555
[root@localhost pcre_test]# 

    如果我们想将+12345和-67890匹配出来,可以使用下面的命令:

[root@localhost pcre_test]# grep -E "^(\+|\-)[0-9]+" sample 
+12345
-67890
[root@localhost pcre_test]# 

    上面使用-E选项,告诉grep后面是一个正则表达式,这里将sample文件名放在最后,grep会去直接读sample的文件内容,然后在文件内容中根据正则表达式进行查找。

    这里的正则表达式"^(\+|\-)[0-9]+",表示以+号或-号开头的,后面跟随了一串数字的文本行。

    我们再来看下{n},{n,m},以及{n,}这类正则表达式的用法:

[root@localhost pcre_test]# grep -E "5{3}" sample
55555
[root@localhost pcre_test]# grep -E "5{1,2}$" sample
+12345
55555
[root@localhost pcre_test]# grep -E "5{3,}" sample
55555
[root@localhost pcre_test]# 

    上面grep会将匹配到的文本进行标红,例如"5{3}"表示匹配3个连续的5,并对这3个5进行了标红处理。"5{1,2}$"表示匹配结尾包含1个或2个5的文本行。"5{3,}"表示匹配最少包含3个连续的5的文本行。

    如果grep的-E选项后面的正则表达式没有用引号(单引号或双引号)扩起来的话,像'{','}'之类的特殊符号,就需要在前面加上'\',才会被当成正则表达式,例如:

[root@localhost pcre_test]# grep -E 5\{3,\} sample
55555
[root@localhost pcre_test]# 

    否则就会被当成文件,并报文件不存在的错误:

[root@localhost pcre_test]# grep -E 5{3,} sample
grep: 5: No such file or directory
[root@localhost pcre_test]# 

 

上下篇

下一篇: Linux系统中的环境变量

上一篇: Linux中的管道,grep和sort命令

相关文章

linux系统中的端口及查询方法详解

Linux中的dump命令用法详解:备份分区、文件或目录

Linux系统内核(内核模块)的加载过程(超详细)

Linux中的lsof命令:列出进程调用或打开的文件信息

Linux和Unix操作系统的比较

Linux系统中使用quotaon命令:开启磁盘配额限制