Loading... <p> </p> <h1 style="text-align: center">正则表达式详解</h1> <h3>一、概述</h3> <p> GREP(global search regular expression(RE) and print out the<br />line),是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。利用这些返回值就可进行一些自动化的文本处理工作。</p> <h3>二、语法格式</h3> <p> 正则表达式: grep [option] …'pattern' file….</p> <p> 扩展正则表达:grep -E 'PATTERN' file….</p> <p> fgrep :fast grep ,不支持使用正则表达式</p> <p> 语法格式上扩展正则表达式仅是比正则表达式多了一个参数 –E;</p> <h3>三、元字符集</h3> <h4>1、字符匹配:</h4> <p> . : 匹配任意单个字符</p> <p> [ ]: 匹配指定范围内的任意单个字符</p> <p> [0-9] [[:digit:]]</p> <p> [a-z] [[:lower:]]</p> <p> [A-Z] [[:upper:]]</p> <p> [[:space:]] [[:punct:]] [[:alpha:]]</p> <p> [^]:取反</p> <h4>2、次数匹配:用于实现指定其前面的字符所能够出现的次数</h4> <p> *:任意长度,用于能够匹配他前面的字符可以出现任意次</p> <p> \?:0次或1次,他前面的字符可有可无的</p> <p> \{m\}:m次,他前面的字符出现m次</p> <p> \{m,n}: 至少m次,至多n次</p> <p> \{m,\}:至少m次</p> <p> \{0,n\}:至多n次</p> <p> .*:任意长度的任意字符,工作于贪婪模式:尽可能的去匹配</p> <h4>3、位置锚定</h4> <p> 行首锚定:^ :要写在模式最左侧</p> <p> 行尾锚定:$: 写在模式最右侧</p> <p> ^$ : 空白行 实例: grep "^$" /etc/issue | wc – l</p> <p> 不包含特殊字符的连续字符组成的串叫单词</p> <p> \<:词首,出现在单词左侧</p> <p> \<char</p> <p> \>:词尾, 出现于单词右侧</p> <p> \>char</p> <p> \b:词首词尾都行</p> <h4>4、分组模式</h4> <p> \(\):分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用;</p> <p> 实例:grep "\(ro\)\{1,\}" /etc/passwd 至少出现一次</p> <p> 引用:有编号:自左而右的左括号,以及与其匹配的右括号;从内向外;</p> <p> \#:引用第n个括号所匹配到的内容,而非模式本身</p> <h3>四、命令选项</h3> <p> -v:反向选取; 如: grep –v "^$" /etc/issue</p> <p> -o:仅显示匹配到的字串,而非字串所在的行 grep "r..t" /etc/passwd -o</p> <p> -i : ignore-case :忽略字符大小写 Cat , cat grep -i "cat"</p> <p> -E:支持使用扩展正则表达式</p> <p> -A #: 被匹配到后面的#行 — grep -A 1 "r..t" /etc/passwd </p> <p> -B #: 前面</p> <p> -C #:前后各一行</p> <h3>五、正则表达式和扩展正则表达式的字符集区别</h3> <p> 1、字符匹配基本一致</p> <p> 2、次数匹配</p> <p> *:任意次</p> <p> ?: 0或1次</p> <p> +:至少1次</p> <p> {m}:精确匹配m次</p> <p> {m , n}: m到n次</p> <p> {m,} :至少m次</p> <p> {0,n}:最多n次</p> <p> 3、锚定基本一致</p> <p> 4、分组</p> <p> ()</p> <p> 引用: \1,\2,\3</p> <p> 或者:</p> <p> a |b :a或者b</p> <p> conC|cat : conC或者cat</p> <p> con(C|c)at : conCat或者concat</p> <h3>六、实例解析</h3> <p> 1、显示/proc/meminfo文件中以大写或小写S开头的行</p> <p> <img title="1431088071525346.png" alt="1.png" src="//cto.wang/usr/uploads/2016/07/20160703180253-93.png" /> </p> <p> 2、显示/etc/passwd中其默认shell为/bin/bash的用户</p> <p> <img title="1431088082151756.png" alt="2.png" src="//cto.wang/usr/uploads/2016/07/20160703180253-16.png" /> </p> <p> 3、显示/boot/grub/grub.conf中以至少一个空白字符开头的行</p> <p> <img title="1431088098109053.png" alt="3.png" src="//cto.wang/usr/uploads/2016/07/20160703180253-86.png" /> </p> <p> 4、添加用户,bash,testbash,basher,nologin(修改此shell为nologin)而后找出当前系统上其用户名和默认shell相同的用户</p> <p> <img title="1431088137911244.png" alt="4.png" src="//cto.wang/usr/uploads/2016/07/20160703180253-53.png" /> 此题值得好好思考一番;</p> <p> 5、扩展题目:</p> <p> 新建一个文本文件,</p> <p> He like his lover.</p> <p> He love his lover.</p> <p> He like his liker.</p> <p> He love his liker.</p> <p> 找出其中最后一个单词是由此前某单词加r构成的行</p> <p> <img title="1431088156791353.png" alt="5.png" src="//cto.wang/usr/uploads/2016/07/20160703180253-5.png" /> </p> <p> 6、找出ifconfig命令结果中1-255之间的数字</p> <p> <img title="1431088163109569.png" alt="6.png" src="//cto.wang/usr/uploads/2016/07/20160703180253-18.png" /> </p> <p> 7、挑战题:写一个模式,能匹配合理的ipv4地址</p> <p> <img title="1431088169963420.png" alt="7.png" src="//cto.wang/usr/uploads/2016/07/20160703180253-61.png" /> </p> <p> <img title="1431088177102825.png" alt="8.png" src="//cto.wang/usr/uploads/2016/07/20160703180253-89.png" /> </p> <p> </p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信