一、正则表达式
正则表达式描述了一个字符串匹配的规则,常用来匹配满足匹配规则的文本。它定义了自己的语法,正则表达式中的字符可以分为普通字符和元字符,元字符在正则表达式中有特殊的含义。先看一下简单的正则表达式:
\bhelloworld\b
这个正则表达式用来精确匹配helloworld这个字符串。\b是一个元字符,表示匹配单词的边界(开始或结束),helloworld中的每个字符是普通字符。
1、常用的元字符包括以下几种
元字符 | 说明 | 举例 |
\b | 匹配字符串边界 | \bhello\b--精确匹配hello |
\s | 匹配空白符(tab,空格等) | hi\shi--匹配hi hi,不匹配hihi |
\d | 匹配数字 | p\bp--可以匹配p2p |
\w | 匹配字母,数字,下划线 | p\wp--可以匹配p_p |
. | 匹配除换行的任意字符 | |
^,& | 分别匹配字符串的开始和结束,对应于\b | ^hello&--精确匹配hello |
此外还有
1.1 管道符 |
表示或,用于多个匹配规则的匹配。如正则表达式 rule1 | rule2将从左向右进行匹配,满足其中一个匹配规则rule1或rule2即可。
1.2 分组 ( )
将正则表达式用()括起来,这样()里面的这部分正则表达式就是一个组。然后可以和限定符结合定义该组表达式的重复次数,而不仅仅是某个字符的重复。
如(\d{3}\.){3}表示数字xxx.重复3次。
1.3 [ ]
在匹配时,只需要匹配[ ]中的任意一个字符即可,如定义一个元音的匹配规则[AaEeIiOoUu]。
还可以用一个范围来表示需要匹配的字符,如
[0-9] //匹配所有的数字
[a-z] //匹配所有的小写字母
[A-Z] //匹配所有的大写字母
[a-zA-Z]//匹配所有的字母
注意,匹配时只能匹配到一个字符,若要匹配到多个字符,如两个,采用这种形式:^[0-9][0-9]&。
2、字符转义\
匹配的字符串中含有元字符时,必须使用转义字符将元字符转换成普通字符。如要查找a.txt时,使用a\.txt。
3、限定符
当我们需要匹配5个数字时,可以使用\d\d\d\d\d这样的形式,这样书写比较繁琐,正则表达式提供了许多限定符来帮我们解决重复字符这个问题。如*是一个限定符,表示前面的字符出现0次或更多次。^hi&.*^hi&可以匹配hi,中间是可重复的任意字符,然后是hi这样的字符串,可以匹配的字符串包括hihi,hixxhi,hixxxhi等等。
限定符 | 说明 |
* | 重复0次或更多 |
+ | 重复1次或更多 |
? | 重复0次或1次 |
{n} | 重复n次 |
{n,} | 重复n次或更多 |
{n,m} | 重复n到m次 |
如 ^\d{3}-\d{4}-\d{4}& 匹配000-0000-0000这样的形式。
4、反义
有时匹配规则描述起来比较复杂,往往用反义字符描述比较简单,常用的反义字符有:
反义字符 | 说明 |
\B | 和\b对立,匹配不是开始或结束的位置 |
\S | 和\s对立,匹配非空白符 |
\D | 和\d对立,匹配非数字 |
\W | 和\w对立,匹配除字母,数字,下划线的字符 |
[^x] | 匹配除x之外的字符 |
[^abc] | 匹配除abc之外的字符 |
5、通用字符类
POSIX还定义了一些特殊的字符类,可以供我们在正则表达式中使用
字符类 | 说明/等价于 |
[[:alnum:]] | [a-zA-Z0-9] |
[[:alpha:]] | [a-zA-Z] |
[[:blank:]] | 空格符 |
[[:cntrl:]] | 控制字符 |
[[:digit:]] | [0-9] |
[[:graph:]] | 非空字符 |
[[:lower:]] | [a-z] |
[[:print:]] | 可打印字符 |
[[:punct:]] | 标点符号 |
[[:space:]] | 空白符 |
[[:upper:]] | [A-Z] |
[[:xdigit:]] | 十六进制数[0-9a-fA-F] |
6、匹配规则
默认情况下正则表达式匹配是贪婪匹配,即匹配尽可能多的字符。
如匹配规则为:a.*b,当它应用于aabab时,会匹配到aabab,而不是abab或ab。
参考:正则表达式到底是什么东西
二、grep命令
Linux命令grep是一个强大的文本搜索工具。它有两个变体,分别是egrep和fgrep。分别对应于grep -E和grep -F。
grep命令的命令格式为:grep [选项]...PATTERN [FILE]...。
其中PATTERN为正则表达式。而POSIX将正则表达式分为了两种,分别是基本正则表达式(BRE)和扩展正则表达式(ERE)。grep命令使用BRE,egrep使用ERE。
BRE和ERE的区别主要在于元字符。
BRE支持的元字符只有^ $ . [] * 其他字符被识别为普通字符。
ERE在BRE的基础上添加了 {},BRE中只将{}当作普通字符对待,要使用此功能必须加\进行转义,即“\{\}”
(),BRE中只将()当作普通字符对待,要使用此功能必须加\进行转义,即“\(\)”
? + | 等。
grep命令最基本的用法是字符匹配,并把匹配的行打印出来。
还可以利用管道命令|和其他命令结合起来实现更复杂的功能。
ps:管道命令 command1 | command2 | command3,前一个命令的输出作为后一个命令的输入。
下面是一些简单的例子:
2.1字符匹配
匹配文件中以l开头的文本,贪婪匹配,打印出所在的行:
2.2结合管道命令
查找指定进程mentohust,将ps的输出输入到grep中进行过滤,结果如下: