Loading... <p> <span style="font-size:14px">正则表达式的使用需要借助于工具程序来实现,我们使用grep来演示正则表达式元字符的使用。</span> </p> <p> <span style="font-size:14px"> <span style="font-size:16px"><strong>grep使用方法 </strong></span> </span> </p> <p> <span style="font-size:14px"> grep是一种文本搜索工具,根据用户指定的文本模式(搜索条件)对目标文件进行逐行搜索,显示能匹配到的行。</span> </p> <p> <span style="font-size:14px"> </span><img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180102-98.png" /> </p> <p> <span style="font-size:14px"> 使用grep在/etc/passwd文件中找到有”roo”关键字的行并显示了出来</span> </p> <p> <span style="font-size:14px"> grep命令的语法:</span> </p> <p> <span style="font-size:14px"> grep [OPTIONS] PATTERN [FILE…] </span> </p> <p> <span style="font-size:14px"> PATTERN:文本字符和正则表达式的元字符组合而成的匹配条件 </span> </p> <p> <span style="font-size:14px"> OPTOINS:此处只列举</span><span style="font-size:14px">常用的选项</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> –color=auto:给关键字加上颜色</span></strong> </p> <p> <span style="font-size:14px"> </span><img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-66.png" /> </p> <p> <span style="font-size:14px"> 可以在全局配置文件/etc/bashrc中定义命令别名grep=”grep –color=auto”,以使grep命令默认输出颜色</span> </p> <p> <span style="font-size:14px"> </span><img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-50.png" /> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> -i:忽略大小写</span></strong> </p> <p> <span style="font-size:14px"> </span><img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-86.png" /> </p> <p> <span style="font-size:14px"> –</span><strong><span style="font-size:14px">v:</span><span style="font-size:14px">显示没有被模式匹配的内容</span></strong><span style="font-size:14px"> </span> </p> <p> <span style="font-size:14px"> </span><img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-29.png" /> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> -o:只显示被模式匹配的串本身</span></strong> </p> <p> <span style="font-size:14px"> </span><img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-83.png" /><span style="font-size:14px"> </span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> -n:显示行号</span></strong> </p> <p> <span style="font-size:14px"> </span><img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-92.png" /><span style="font-size:14px"> </span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">-A #:显示匹配字符的后面“#”行</span></strong> </p> <p> <span style="font-size:14px"> </span><img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-41.png" /> </p> <p> <span style="font-size:14px"> 显示包含roo字符行的后面一行</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">-B #:显示匹配字符的前面“#”行</span></strong> </p> <p> <span style="font-size:14px"> </span><img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-2.png" /> </p> <p> <span style="font-size:14px"> 显示包含ROO字符行的前面一行</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">-C #:显示匹配字符的前后面“#”行</span></strong> </p> <p> <span style="font-size:14px"> </span><img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-51.png" /> </p> <p> <span style="font-size:14px"> 显示包含roo字符的前后各一行</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">-E:扩展正则表达式</span></strong> </p> <p> <span style="font-size:14px"><span style="font-size:16px"><strong>正则表达式:Regular Expression, REGEXP</strong></span> </span> </p> <p> <span style="font-size:14px"> 常用正则表达式分为两种</span> </p> <p> <span style="font-size:14px"> 1. 基本正则表达式(Basic REGEXP)</span> </p> <p> <span style="font-size:14px"> grep</span> </p> <p> <span style="font-size:14px"> 2. 扩展正则表达式(Extended REGEXP)</span> </p> <p> <span style="font-size:14px"> egrep、grep -E</span> </p> <p> <span style="font-size:14px"> 元字符:不表示其字面意义,而用于额外功能性描述</span> </p> <p> <span style="font-size:14px"> 基本正则表达式的元字符:</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">字符匹配</span></strong><span style="font-size:14px">:</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> . :匹配任意单个字符</span></strong> </p> <p> <span style="font-size:14px"> </span><img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-47.png" /> </p> <p> <span style="font-size:14px"> r..t:表示以r开头,中间包含两个任意字符并以t结尾的字符串</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> [ ]:</span></strong><strong><span style="font-size:14px">匹配指定范围内的任意单个字符</span></strong> </p> <p> <img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-47-1.png" /> </p> <p> <span style="font-size:14px"> r[a-z]t:表示以r开头,中间包含一个任意小写字母并以t结尾的字符串</span> </p> <p> <span style="font-size:14px"> 可以使用一些特殊符号还表示特定的值范围 </span> </p> <p> <span style="font-size:14px"> [[:digit:]] :表示数字,相当于[0-9]</span> </p> <p> <span style="font-size:14px"> [[:lower:]]:表示小写字母,相当于[a-z]</span> </p> <p> <span style="font-size:14px"> [[:upper:]]:表示大写字母,相当于[A-Z]</span> </p> <p> <span style="font-size:14px"> [[:space:]]:表示任何会产生空白的字符,如空格键、tab键等</span> </p> <p> <span style="font-size:14px"> [[:punct:]]:表示标点符号</span> </p> <p> <span style="font-size:14px"> [[:alpha:]] :表示任何大小写字母,相当于[a-zA-Z]</span> </p> <p> <span style="font-size:14px"> [[:alnum:]]:表示任何大小写字母和数字,相当于[0-9a-zA-Z]</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> [^]:匹配指定范围外的任意单个字符</span></strong> </p> <p> <img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-11.png" /> </p> <p> <span style="font-size:14px"> r[^[:lower:]]t:表示以r开头,中间包含一位非小写字母并以t结尾的字符串 </span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">次数匹配:用于实现指定其前面的字所能够出现的次数</span></strong><span style="font-size:14px"> </span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">*:任意长度,前面的字符可以出现任意次</span></strong> </p> <p> <img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-47-2.png" /> </p> <p> <span style="font-size:14px"> r*t:其中r*表示可以为空字符或一个连续r以上的字符;</span> </p> <p> <span style="font-size:14px"> 如果需要至少两个r以上的字符串时,使用rrr*来表示</span> </p> <p> <img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-57.png" /> </p> <p> <span style="font-size:14px"> 同理需要至少三个r以上的字符串时,使用rrrr*来表示</span> </p> <p> <img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-13.png" /> </p> <p> <strong><span style="font-size:14px">\?:匹配其前面的字符一次或0次,它前面的字符是可有可无的,其中\为转义字符</span></strong> </p> <p> <img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-69.png" /> </p> <p> <span style="font-size:14px"> rr\?t:表示以r开头,中间有一个或者为空字符并且以t结尾的字符串</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">\{m\}:m次,它前面的字符要出现m次</span></strong> </p> <p> <img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-85.png" /> </p> <p> <span style="font-size:14px"> r\{2\}:表示包含两个连续r的字符串</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> \{m,n\}:匹配其前面的字符至少m次,至多n次</span></strong> </p> <p> <img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-96.png" /> </p> <p> <span style="font-size:14px"> r\{2,4\}t:表示包含2至4个连续r,并且以t结尾的字符串</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">\{m,\}:最少匹配其前面的字符m次</span></strong> </p> <p> <img alt="" src="//cto.wang/usr/uploads/2016/07/20160703180103-21.png" /> </p> <p> <span style="font-size:14px"> r\{5\}:表示最小出现5个连续的r并且以t结尾的字符串</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> \{0,n\}:最多匹配其前面的字符n次</span></strong> </p> <p> <img alt="" src="/upload/lkm4b5rvhct.png" /> </p> <p> <span style="font-size:14px">r\{0,5\}:表示最多出现5个连续的r并且为t结尾的字符串</span> </p> <p> <img alt="" src="/upload/xp0xmthsa40.png" /> </p> <p> <span style="font-size:14px"> 注:结果中出现了上面所示的行,是因为没有限定条件不严格造成的,可以定义字符串首部来得到精确结果</span> </p> <p> <img alt="" src="/upload/bilwmt3zwnh.png" /> </p> <p> <strong><span style="font-size:14px">.*:任意长度的任意字符</span></strong> </p> <p> <img alt="" src="/upload/siab03cpyoy.png" /> </p> <p> <span style="font-size:14px"> r.*t:表示r与t之间为任意字符(包括空字符)的字符串 </span> </p> <p> <span style="font-size:14px"> 位置锚定:用于定义字符位置的元字符</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">^:锚定行首,此字符后面的任意内容出现在行首。</span></strong> </p> <p> <img alt="" src="/upload/teloflr4hjx.png" /> </p> <p> <span style="font-size:14px"> 查找以r开头t结尾的4个字符的字符串开头的行</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> $:锚定行尾,此字符前面的任意内容出现在行尾</span></strong> </p> <p> <img alt="" src="/upload/fp4pjth2arg.png" /> </p> <p> <span style="font-size:14px"> 查找以n结尾的行 </span> </p> <p> <strong>^$:空白行</strong> </p> <p> <img alt="" src="/upload/t1mem00jcps.png" /> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">\<或\b:其后面的任意字符必须作为单词首部出现</span></strong> </p> <p> <img alt="" src="/upload/rwz32rsfvkw.png" /> </p> <p> <img alt="" src="/upload/2dqvimm1b1n.png" /> </p> <p> <span style="font-size:14px"> 包含以op开头的单词的行</span> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> \>或\b:其前面的任意字符必须作为单词尾部出现</span></strong><span style="font-size:14px"> </span> </p> <p> <img alt="" src="/upload/xbl4513zwwk.png" /> </p> <p> <img alt="" src="/upload/c3ijqop2wyk.png" /> </p> <p> <span style="font-size:14px">包含以ot结尾的单词的行 </span> </p> <p> <span style="font-size:14px"> 可以将两个符号结合使用,精确查找单词</span> </p> <p> <img alt="" src="/upload/rhkaghba5zj.png" /> </p> <p> <strong> <span style="font-size:14px">分组:</span></strong> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px">\( \):把内容分组,括号中的字符将被看作是一个整体进行操作</span></strong> </p> <p> <span style="font-size:14px"> 分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用</span> </p> <p> <span style="font-size:14px"> 例如:当我们想要查找一个文件中包含至少1个ab的行</span> </p> <p> <span style="font-size:14px"> 新建一个文件eg</span> </p> <p> <img alt="" src="/upload/ssz5ebegq1n.png" /> </p> <p> <img alt="" src="/upload/th03evxqccy.png" /> </p> <p> <strong><span style="font-size:14px">引用:</span></strong> </p> <p> <span style="font-size:14px"> </span><strong><span style="font-size:14px"> \#:引用第#</span><span style="font-size:14px">个括号所匹配到的内容,而非模式本身</span></strong> </p> <p> <span style="font-size:14px"> 例如:</span> </p> <p> <span style="font-size:14px"> 新建一个文件eg1,内容如下:</span> </p> <p> <img alt="" src="/upload/wzczq5rgko2.png" /> </p> <p> <span style="font-size:14px"> 使用分组得到以下结果</span> </p> <p> <img alt="" src="/upload/hj1vcbcyghj.png" /> </p> <p> <span style="font-size:14px">下面使用引用来查找对应的行</span> </p> <p> <img alt="" src="/upload/ntam5axpzmq.png" /> </p> <p> <img alt="" src="/upload/5w0owiswmxo.png" /> </p> <p> <span style="font-size:14px"> 表达式中的括号是有编号的,从最左边的左括号开始计算,编号从1开始,上面的表达式中有两个左括号,edu前面的为编号1,qa前面的为编号2;而与左括号相对应的右括号则是从里向外就近匹配,上面的表达式中编号为2的表达式为\(qa[[:digit:]]\),编号为1的表达式为\(edc[0-9]\{3\}\(qa[[:digit:]]\)\); </span> </p> <p> <span style="font-size:14px"> \1表示如果在行中有匹配编号为1的表达式的结果,并且在本行再次出现此表达式的结果时,则此行被选中;如上图的查询结果中1号表达式的结果为”edc123qa7“,而后面又出现了一次此字符串,所以该行被选中;\2则引用2号表达式的结果进行匹配查找,2号表达式的结果为”qa7″,所以结果中列出了再次出现”qa7″字符串的行。</span> </p> <p> <span style="font-size:16px"><strong>扩展正则表达式:</strong></span> </p> <p> <strong> </strong><span style="font-size:14px"> <strong>字符匹配:与基本正则表达式相同</strong></span> </p> <p> <span style="font-size:14px"><strong> . :匹配任意单个字符</strong></span> </p> <p> <span style="font-size:14px"><strong> [ ]:匹配指定范围内的任意单个字符</strong></span> </p> <p> <span style="font-size:14px"><strong> [^]:匹配指定范围外的任意单个字符</strong></span> </p> <p> <span style="font-size:14px"><strong> 次数匹配:无需转义字符</strong></span> </p> <p> <span style="font-size:14px"><strong> *:任意长度,前面的字符可以出现任意次</strong></span> </p> <p> <span style="font-size:14px"><strong> ?:匹配前面的字符0或1次</strong></span> </p> <p> <span style="font-size:14px"><strong> +:至少1次= \{1,\}</strong></span> </p> <p> <span style="font-size:14px"><strong> {m}:精确匹配m次</strong></span> </p> <p> <span style="font-size:14px"><strong> {m,n}:至少m次,至多n次</strong></span> </p> <p> <span style="font-size:14px"><strong> 锚定:与基本正则表达式相同,词首与词尾锚定依然需要转义</strong></span> </p> <p> <span style="font-size:14px"><strong> 分组:与基本正则表达式相同,无需转义</strong></span> </p> <p> <span style="font-size:14px"><strong> ():无需转义</strong></span> </p> <p> <span style="font-size:14px"><strong> 引用:\1,\2,\3 …</strong></span> </p> <p> <span style="font-size:14px"> <strong>或者:</strong></span> </p> <p> a|b:a或者b </p> <p> <img alt="" src="/upload/zwoox03hs5l.png" /> </p> <p> 使用扩展正则表达式完成上面的引用查询 </p> <p> <img alt="" src="/upload/pall4q5osym.png" /></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信