Linux正则表达式 | grep

一、正则表达式


正则表达式描述了一个字符串匹配的规则,常用来匹配满足匹配规则的文本。它定义了自己的语法,正则表达式中的字符可以分为普通字符和元字符,元字符在正则表达式中有特殊的含义。先看一下简单的正则表达式:

           \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中进行过滤,结果如下:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值