grep正则表达式原理介绍及应用实例

前端之家收集整理的这篇文章主要介绍了grep正则表达式原理介绍及应用实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

应用背景:我们刚刚添加了一个用户Luffy,但是不知道他的默认shell是什么。

问题:如何取出一个用户的默认shell?


解决方法

#grep '^Luffy\>' /etc/passwd | cut -d: -f7

/bin/bashf

通过上面的方法,我们就得到了Luffy这个用户的默认shell

文本搜索工具:就是要根据用户指定的文本模式,逐行的进行匹配,最终得到符合文本模式的行

grep是一个强大的文本搜索工具,下面我们就介绍一下grep的语法:

grep [OPTIONS] PATTERN [FILE...]

grep后面上选项,然后是模式,最后是文件


1、它的常用选项有

-E,--extended-regexp //即,扩展的grep,我们后面会提及到egrep

-i,--ignore-case //即,忽略大小写

-v,--invert-match //即,取相反的操作

-o,--only-matching //即,仅显示匹配到的字串,并非所在行

-B,--before-context=NUM //即,取出匹配的行的前面三行的数据

-A,--after-context=NUM //即,取出匹配的行的后面三行的数据

-C,--context=NUM //即,取出匹配的行的上下三行的数据

-n,--line-number//即,匹配结果显示时,加上行号

2、说到匹配模式,我们就引入第二个概念,正则表达式

正则表达式:是一类字符所组成的模式,且其中的字符,不表示其字面的意义,是一种控制或是通配功能的元字符。

简单来说,正则就是为了我们精确描述需要的内容所设置的,可以用于多个命令。


基本正则表达式的元字符

a、字符匹配:

.:匹配任意的单个字符

举例:L..e 匹配有个L,后面跟两个字符,最后有个e的行

[]:匹配指定范围内的任意的单个字符

[0-9],[[:digit:]]----匹配数字

[a-z],[[:lower:]]----匹配小写字母

[A-Z],[[:upper:]]----匹配大写字母

[[:punct:]]----匹配标点符号

[[:alnum:]]----匹配字母或是数字

[[:alpha:]]----匹配字母(可以使大写、小写)

[[:space:]]----匹配空格

[^]-----取反

举例:[^A-Z] 匹配不在范围A到Z之间的任意个字符

b、次数匹配元字符:实现其前面的字符出现的次数

*:表示其前面的字符可以出现任意次

\?:表示其前面的字符可以出现0次或是1次,即该字符是可有可无的

举例:lover\? 即r是可有可无的,可以使lover也可以是love

\{m\}:精确匹配,表示其前面的字符要出现m次

\{m,n\}:范围匹配,表示其前面的字符出现的次数在m,n之间,最小m次,最大n次

\{m,\}::范围匹配,表示其前面的字符出现最少m次

\{0,n\}:范围匹配,表示其前面的字符出现最多n次,可以在0到n次匹配

c、位置锚定:

^:行首锚定,即一行的开始位置

举例:^love 匹配所有以love开头的行

$:行尾锚定,即一行的末尾位置

举例:love$ 匹配所有以love结尾的行

^$:行首和行尾,表示空白行

\<:词首锚定,匹配单词的左侧,也可以用\b

举例:\<love 匹配包含以love开头的词的行

\>:词尾锚定,匹配单词的右侧,也可以用\b

举例:love\> 匹配包含以love结尾的词的行

d、分组:

\(\):分组中的模式匹配到的内容,可由正则记忆在内存中,之后可被使用

e、引用:

\n:引用第几个括号所匹配到的内容,而非模式本身

举例:\(love\).*\1r 匹配love,然后引用,后面加r,变成lover


扩展正则表示式(egrep):grep -e = egrep

字符匹配:

.:匹配任意的单个字符

[]:匹配指定范围内的任意的单个字符(应用如上面的基本正则)

[^]:表示取反

次数匹配:(与上方的基本正则不同的是,没有转义符\

*:任意次

?:0次或是1次

+:至少一次

{m}:精确匹配m次

{m,n}:至少m次,最多n次

{m,}:最少m次

{0,n}:最多n次

锚定:(参考上面基本正则的用法)

分组:

( ):分组中的模式匹配到的内容,可由正则记忆在内存中,之后可被使用

注意:与上面的基本正则不同,没有转义符

引用:同上基本正则

或者:|

redhat|centos : redhat或者centos

实例应用(基础):

准备:将对如下的名为chsang.txt的文件进行操作

wKioL1PA0XeBOz_fAABsAI212eM064.jpg

grep篇:

1、显示b和y之间有一个字符的行

wKiom1PA0fDC2ZLcAAAvgEYab0U587.jpg

2、找出以小写s开头的行:

wKioL1PA0hKgMfOtAAAy-XnZnvY649.jpg

3、找出以空白开头的行

wKioL1PA0lGhU5DhAAA56iCGEKU552.jpg

4、找出含有数字开头的行

wKioL1PA0uKgeQZBAAAz_NFimAI040.jpg

5、找出有most和must单词的行

wKiom1PA00ySlZTEAAAzWt6LWks450.jpg

6、找出small和smll开头的行

wKioL1PA03DAmCDFAAA2aBkOkNo237.jpg

7、找出一个单词开头最面加r的行

wKiom1PA0-_BSYnMAAA1O0ENqVE552.jpg

egrep篇:

1、找出大小写s开头的行

wKiom1PA1E_R70VcAAA46oojfPA057.jpg

2、只显示后面以点结尾的单词

wKiom1PA1iDSe2DKAABAX6A842k901.jpg

3、找出两位数或是两位数以上的行

wKioL1PA1kySqy07AAA2yOmQ5Qc905.jpg

提高题:

1、取出当前主机的ip地址

wKiom1PA2AmQLZAcAAA3JIs-aDE986.jpg

2、取出/etc/inittab文件中,以#开头,且后面跟一个空格的行

wKioL1PA2O3wa9U7AADed2dZT3A349.jpg

3、找出ifconfig命令结果中的1-255之间的数字

wKiom1PA2cKguepbAACxnaaR8kw620.jpg


总结:grep在对于数据的处理,通过正则,我们可以从文件中取到我们需要的数据,并将其显示出来

对于不懂的地方,希望读者朋友多用man去查阅或是google一下。

以上都是个人通过学习后的理解,在这里我要感谢马哥教育给我带来的成长,同时,对于文章中的不对之处,请各位读者联系我,sch_0221@163.com,这是我的第一个博客,不喜勿喷,谢谢

猜你在找的正则表达式相关文章