上一节我们介绍过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]#