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

grep正则表达式详解及练习

发布时间:2020-12-14 04:33:26 所属栏目:百科 来源:网络整理
导读:grep正则表达式详解及练习 一、在学习grep正则表达式前,先了解下linux著名的文本处理三剑客: (1) grep、egrep、fgrep文本搜索工具 。 (2)sed文本编辑工具,一种流编辑器,行编辑工具。 (3)awk强大的文本分析工具,文本格式化工具,文本报告生成器。

grep正则表达式详解及练习

一、在学习grep正则表达式前,先了解下linux著名的文本处理三剑客:

(1)grep、egrep、fgrep文本搜索工具

(2)sed文本编辑工具,一种流编辑器,行编辑工具。

(3)awk强大的文本分析工具,文本格式化工具,文本报告生成器。

以上三大命令均支持正则表达式,本文以grep正则表达式为例展开学习。

1、什么是正则表达式?

正则表达式(RegularExpression):由一类特殊字符及文本字符所编写的模式,其有些字符不表示其字面意义,而是用于表示控制或通配的功能。正则表达式只是字符串的一种描述(一种表示法),只有和支持正则表达式的工具相结合才能进行字符串处理。

2、正则表达式的构成:

正则表达式由两种字符构成。一种是在正则表达式中具体特殊意义的“元字符”,另一种是普通的“文本字符”。元字符可以是一个字符,如“^”,也可以是一个字符序列,如“b”。

3、主要分为两类:(1)基本正则表达式(BRE)

(2)扩展正则表达式(ERE)

二、本文以grep为例来讲解正则表达式

1、grep家族有三大成员分别为:

grep:支持使用基本正则表达式。

egrep:支持使用扩展正则表达式。

fgrep:不支持使用正则表达式

2、grep命令:

功能:根据用户指定的”pattern(过滤条件)“对目标文本逐行进行匹配检查;打印出符合条件的行,即文本搜索工具。注:PATTERN即过滤条件指由文本字符及正则表达式元字符所编写的字符串。


常用选项一:

--color=auto,每次grep搜索之后,自动高亮显示所匹配字符。

wKioL1berP7i4x55AAAQwWB2L4g367.png

CentOS7定义了grep别名alias grep=’grep--color=auto’

wKiom1berPySio10AAAGyykQcQg733.png

-i:忽略字符大小写

wKiom1beraqCvSqOAAAfX9XcIyI420.png

-o:仅输出文件中匹配到的部分

wKioL1bermjQRV8UAAARprFDazM249.png

-v:反向查找,输出文件中不匹配的行。

wKiom1beriHj0OdbAAAfBbKMDFc210.png

-q:进入静默模式,该模式下,grep命令运行目的仅仅是执行一个条件测试,通常在脚本中使用,通过检查其返回值进行下一步操作。

wKiom1berkvCBF95AAATs3UJUV0901.png

常用选项二:

-E:支持使用扩展正则表达式,相当于egrep;

-F:支持使用固定字符串,不支持正则表达式,相当于fgrep;

-G:支持使用基本正则表达式;

-P:支持使用pcre正则表达式;

-A:显示匹配字符串及后n行的数据

-B:显示匹配字符串及前n行的数据

-C:显示匹配字符串及前后各n行的数据

-e:多模式机制;

-f:FILE为每行包含了一个pattern的文本文件,即grep script;

-n:在行首显示行号


3、基本正则表达式元字符:

(1)字符匹配:

.:匹配任意单个字符

[]:匹配范围内的任意单个字符[abc]表示“a”或“b”或“c”

[^]:匹配范围外的任意单个字符 [^abc]表示除了“a”、“b”、“c”外的其他任意字符。

(2)匹配次数:用在要指定其出现的次数的字符后面,限制其前面字符出现的次数,默认工作在贪婪模式。

*:匹配前面的字符任意次(0、1、或多次),相当于{0,}

.*:任意长度的任意字符;

+:匹配前面的字符至少1次,相当于{1,}?:匹配前面的字符0次或者1次,即前面的字符可有可无,相当于 {m}:其前面的字符出现m次,m为非负整数;

{m,n}:其前面字符出现最少m次最多n次,最少m次,{o,SimKai;">最多n次;

(3)位置锚定:限制使用搜索模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的那个位置

^:行首锚定;用于模式的最左侧,^PATTERN, ^hello搜寻以hello开头的行。

$:行尾锚定;用于模式的最右侧,$PATTERN, $hello搜寻以hello结束的行。

^PATTERN$:让PATTERN完全匹配一整行,^how are you$搜索内容为”how are you”的行。

^$:搜寻内没有任何字符的行(包括空白字符),空行

^[[:space:]]*$:空行或仅有空白字符的行;

(4)单词锚定: Linux中的单词指:由非特殊字符组成的连续字符(字符串)。

&;b:词首锚定,用于单词模式的左侧,&;PATTREN或bPATTERN

&;:词尾锚定,用于单词模式的右侧,PATTERN&;或PATTRENb

&;PATTERN&;:单词锚定

(5)分组与引用:

(PATTERN):将此PATTERN匹配到的字符作为一个不可分割的整体进行处理;分组匹配到的内容会被正则表达式引擎自动记录到内部变量中,这些变量是1,2,3,…

pat1(pat2)pat3(pat4(pat5)pat)

1:第一组括号中的pattern匹配到的字符串,从左侧起,第一个左括号及与之匹配的右括号内模式匹配到的内容。

2:第二组括号中的pattern匹配到的字符串,从左侧起,第二个左括号及与之匹配的右括号内模式匹配到的内容。

后向引用:引用前面括号中的模式所匹配到的字符

wKioL1betCDQ2e1yAAAUPMQ0U58608.png

输出结果中行首字符跟行尾字符相同(行尾引用了行首匹配到内容)。

4、egrep命令

支持使用扩展正则表达式的grep命令,相当于grep -E,其常用选项基本同grep命令,可参考上文。

5、扩展正则表达式元字符:

扩展正则表达式就是在基本正则表达式的基础上,增加了一些元字符,而且有部分参数是不需要添加转义符使用的。

(1)字符匹配:

.:匹配任意单个字符

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

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

(2)匹配次数:

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

.*:任意长度的任意字符;

+:匹配前面的字符至少1次

?: 匹配前面的字符0次或者1次,即前面的字符可有可无;

{m}:其前面的字符出现m次,m为非负整数;

{m,n}:其前面字符出现最少m次最多n次,{o,n}最多n次

(3)位置锚定:

^:行首

$:行尾

&;,b:词首

&;,0);">b:词尾

(4)分组及引用:

( ):分组

1,2:后向引用

注意:特殊用法

C|cat:表示C或cat,表示整个左侧或整个右侧。

(C|c)at:表示Cat或cat

三、作业练习:

1、显示/etc/passwd文件中以bash结尾的行;

wKioL1beuEfRb6DuAAAaEWLukBM741.png

2、找出/etc/passwd文件中的三位或四位数;

wKioL1beuFfwFzR9AACIG0zmzqM308.png

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

wKiom1bet-zSGRsZAAA6E08H-co699.png

4、找出"netstat-tan”命令的结果中,以‘LISTEN’后跟0或多个空白字符结尾的行;

wKioL1beuIGA39KaAAAiYP-1Yks284.png

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

wKiom1beuA6x_3N8AAAR9z9Ij1Q254.png

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

wKiom1beyQbxd1K1AAAfACC_LlU696.png

7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;

wKiom1beuEDB-nrHAAAg0Xi-rhM670.png

8、显示当前系统上root、centos或spark用户的相关信息;

wKiom1beuFKyyCgdAAAaq2qxjlA411.png

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

wKiom1bev3mA9xCfAAAKzLRBbyc864.png

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

wKioL1bewA-B5WilAABRigi2DKM558.png

11、找出系统中其用户名与shell名相同的用户。

wKioL1bewEqh2B9GAAAVkXyKmcc409.png

(编辑:李大同)

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

    推荐文章
      热点阅读