加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

grep、egrep及相应的正则表达式和用法

发布时间:2020-12-13 22:10:44 所属栏目:百科 来源:网络整理
导读:什么是正则表达式 正则表达式是你定义的、Linux工具用来过滤文本的模式模板。Linux工具(如grep,egrep)能 够在数据流向工具时对数据进行正则表达式模式匹配。如果数据匹配模式,它就会被接受并进一 步处理。如果数据不匹配模式,它就会被过滤掉。示意图如

什么是正则表达式

正则表达式是你定义的、Linux工具用来过滤文本的模式模板。Linux工具(如grep,egrep)能

够在数据流向工具时对数据进行正则表达式模式匹配。如果数据匹配模式,它就会被接受并进一

步处理。如果数据不匹配模式,它就会被过滤掉。示意图如下:

wKiom1beGqbjbumvAAAJoVdxQHw010.png

正则表达式基本知识

正则表达式的实现是依靠正则表达式引擎来实现的。

什么是正则表达式引擎?它是解释正则表达式模式并使用该模式进行文本匹配的底层软件。

Linux中有两种主流正则表达式:

BRE:基本正则表达式;

ERE:扩展正则表达式;

学习正则表达式首先要了解正则表达式的元字符。

wKioL1beNe2STzReAABSaySXZ_I526.png

ERE元字符与BRE类似,写法更简洁并增加新的元字符。

wKiom1beibGTJ4X4AABP1UpEloc608.png

以上元字符将通过grep(BRE)和egrep(ERE)逐个演示

grep命令简介

grep家族:

grep:支持基本正则表达式;

egrep:支持扩展正则表达式;

fgrep:不支持正则表达式;

grep命令:

grep [OPTIONS] PATTERN [FILE...];

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...];

常用参数:

参数 含义
--color=auto 对匹配到的文本着色后高亮显示
-i 忽略字符大小写
-v 反向匹配
-o 仅显示匹配到的文本自身
-E 支持扩展的正则表达式
-q 静默模式,不输出任何信息

egrep命令:

相当于grep -E 使用方式与grep相似;

正则表达式练习

练习说明

下列练习都大多数没有给出文字解释,个人认为解释是没必要的,一切都在做中学,不理解的

地方仿照例子写几个测试多做几次,这比文字解释更直观。

grep参数使用练习:

-i忽略大小写:

wKioL1beMKrQuMdUAAAOqdosa0g298.png

-v反向匹配:

wKiom1beMTyi3Ec5AAAbD1Y7VDM762.png

-o只显示匹配内容:

wKiom1beMiGSspBbAAAXt2flwcc992.png

-q静默模式:

wKiom1beMr6DVpavAAAQ5u919cY961.png

BRE元字符练习

.匹配单个字符

wKioL1beO3Pz8BoIAAAYB7l7j3M805.png

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

wKioL1beOIfSY5lJAAAzbYmP50g574.png

[]特殊字符

wKiom1beOX3BjD8AAABTcjEl9MU023.png

[^ ]匹配范围外的任意单个字符

wKiom1beOn2wfvd7AAAVdBgHtSc196.png

*匹配前面的字符任意次(0,1或多次)

wKioL1bePAuDTxRVAAAVaO_oXPc303.png

+匹配前面的字符至少1次(不要忘了“”)

wKioL1bePjahyva4AAAOmtrRBpU192.png

?匹配前面的0次或1次(不要忘了“”):

wKiom1bePSHDUrZaAAANps1Nl_Y768.png

{m}其前面的字符出现m次,m为非负整数(不要忘了“”)

{m.n}其前面的字符出现m次,m为非负整数;[m,n]

wKioL1beP0XifVGzAAAVJSlESE0080.png

^行首匹配

wKioL1beP8GBW4chAAAP1rZXXdw495.png

$行尾匹配

wKiom1beP5Tharh2AAAVj3PtyhI093.png

&;或b匹配单词左侧

&;或b匹配单词右侧

&;word&;匹配整个单词

wKioL1beQsSywSP2AAAySk5yQiU136.png

(x)将此x匹配到的字符当作整体进行处理

n:第n个括号的匹配模式所匹配到的内容

要求匹配like...liker和love...lover

wKiom1beSHOhqANqAAAkxLDtBZ8072.png

这个需要说明下,按照需求第一印象的匹配方案是l.*e.*l.*r,但这样会匹配love..liker,

like...lover。

如果要避免这样的问题,后一个单词的匹配必须使用第一个匹配单词的结果。也就是当

匹配到like后,将like保存,在第二个匹配是直接加上r使用(第二个匹配模式变为liker)。

所以(like)的意思就是匹配到like后,将like保存,通过1(引用第一个括号匹配到的内容)

来建立第二个liker匹配模式。

--------------------------------------------------------------------------------------------

egrep练习

egrep使用扩展正则表达式,所以很多元字符可以简写,如()、{}、+、?。下面补充"|"的

示例,其他的以综合练习为主。

|匹配左边后右边

wKioL1beWOTwM_wuAAAgW2RdsQM522.png

---------------------------------------------------------------------------------------------

综合练习1

找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行

wKiom1bejOLz0kokAAAcubl4U1o423.png

综合练习2

找出"fdisk -l“命令的结果中,包含以/dev/后跟sd或hd及一个小字母的行

wKiom1bejdeAiW6dAAAP7IvKwDU355.png

综合练习3

找出”ldd /usr/bin/cat“命令的结果中文件路径

wKiom1bejyvxFdMcAAANannLqoY623.png

综合练习4

echo输出一个绝对路径,使用egrep取出其基名

wKioL1bef6GxOj-aAAAh3AynTsc003.png

遇到的问题

之前做的时候没有考虑到目录情况,当时的解决方案是第一条指令,当换成目录就就失灵了。

修改方案

在$前添加/?(/出现0或1次)就完美解决。

综合练习5

找出ifconfig命令结果中的1-255之间的整数

方案1

wKiom1begKWhF7naAABMu2OtAwk225.png

问题

出现超出255的数字和非单个数字

分析原因

从上图可以看出,默认下[0-9]进行全匹配

wKioL1begY-x49_CAAAHeCb9e34092.png

解决方案

加上单词边界,就明确指定了要匹配数字的位数

wKiom1behPqgl5IGAAARcoSOQ10339.png

最终方案

wKiom1beg86gSi_fAAA-nN349sM758.png

综合练习6

添加用户bash、testbash、basher及nologin,要求前三个用户的默认shell为/bin/bash,

nologin的默认shell为/sbin/nologin,而后找出其用户名与shell名相同的用户

wKiom1behhGxc3Z9AAAZcoPsIr8311.png

综合练习7

匹配电话号码,模板如下:

(123)456-789

(123) 456-789

123-456-789

123.456.789

wKioL1beiUzjIn8JAAATXCuCNg4985.png


综合练习8

找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行

wKiom1betTbC4BHTAAAyFtSir1k505.png

尾巴

正则表达式要想达到熟练应用,必须经过大量练习,今后看到好的习题会追加到该文章。

Learn Linux The Hard Way!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读