Loading... <p><span style="font-family: 楷体,楷体_GB2312,SimKai">bashshell中的正则表达式</span></p> <p style="text-align: left"><span style="font-family: 楷体,楷体_GB2312,SimKai"> 俗话说,工欲善其事,必先利其器。由于很多Linux的文本处理工具普遍使用到了正则表达式,因此,不理解正则表达式就无法愉快的从事Linux日常系统管理。那什么是正则表达式呢?</span></p> <p style="text-align: left"><span style="font-family: 楷体,楷体_GB2312,SimKai"><span style="font-family: Microsoft YaHei UI"> </span> 正则表达式(RegularExpression)主要由普通字符和元字符组成。例如:键盘上的英文字母和数字都属于普通字符,普通字符可以以正常人类思维去理解,a就是英文的小写字母a,Shell没有任何隐藏含义。而^,*,#,这些比较诡异的元字符,Shell赋予了它们超越自身的意义。你可能认为*只是一个乘法符号,但实际上却表示了重复前面的字符0次或多次的隐藏含义。</span></p> <p style="text-align: left"><span style="font-family: 楷体,楷体_GB2312,SimKai"><span style="font-family: Microsoft YaHei UI"> </span> 实际上,正则表达式在数据流处理的过程中完成的是数据过滤,也就是将满足正则表达式定义的数据留下来,将不满足正则表达式的数据拒绝掉。下面我们来看一看正则表达式能留住哪些元字符</span></p> <p></p> <p></p> <p>正则表达式:</p> <p><span style="font-family:Microsoft YaHei UI"> </span> * 匹配任意个字符,0个或多个</p> <p><span style="font-family:Microsoft YaHei UI"> </span> . 匹配任意单个字符</p> <p><span style="font-family:Microsoft YaHei UI"> </span> .* 匹配任意字符</p> <p><span style="font-family:Microsoft YaHei UI"> </span> ^ 匹配行首</p> <p><span style="font-family:Microsoft YaHei UI"> </span> $ 匹配行尾</p> <p><span style="font-family:Microsoft YaHei UI"> </span> [] 匹配字符集合</p> <p><span style="font-family:Microsoft YaHei UI"> </span> \<\> 精确匹配单词符号</p> <p><span style="font-family:Microsoft YaHei UI"> </span> \{n\} 匹配之前的字符n次</p> <p><span style="font-family:Microsoft YaHei UI"> </span> \{n,\} 至少匹配之前的字符n次</p> <p><span style="font-family:Microsoft YaHei UI"> </span> \{n,m\} 至少匹配之前的字符n次,至多m次</p> <p></p> <p></p> <p>除了上述的正则表达式外,Linux工具中的awk,grep,perl等工具还支持扩展的正则表达式</p> <p><span style="font-family:Microsoft YaHei UI">扩展正则表达式</span></p> <p><span style="font-family:Microsoft YaHei UI"> </span> ? 匹配一个或0个在其之前的普通字符</p> <p><span style="font-family:Microsoft YaHei UI"> </span> + 至少匹配一个在其之前的普通字符,相当于\{1,\}</p> <p><span style="font-family:Microsoft YaHei UI"> </span> () 匹配一个字符集合</p> <p><span style="font-family:Microsoft YaHei UI"> </span> | 表示或,用来匹配一组可选字符串</p> <p></p> <p>POSIX字符类</p> <p><span style="font-family:Microsoft YaHei UI"> </span> [:upper:] 表示所有大写字母</p> <p><span style="font-family:Microsoft YaHei UI"> </span> [:lower:] 表示所有小写字母</p> <p><span style="font-family:Microsoft YaHei UI"> </span> [:alnum:] 表示所有大小写字母和数字</p> <p><span style="font-family:Microsoft YaHei UI"> </span> [:space:] 表示空白字符</p> <p><span style="font-family:Microsoft YaHei UI"> </span> [:alpha:] 表示所有大小写字母</p> <p><span style="font-family:Microsoft YaHei UI"> </span> [:digit:] 表示所有数字</p> <p><span style="font-family:Microsoft YaHei UI"> </span> [:cntrl:] 表示Ctrl键</p> <p style="text-align: center"></p> <p>好了,了解了这么多元字符,可以大展身手了,用到正则表达式莫过于grep,egrep,fgrep三兄弟了</p> <p></p> <p style="text-align: justify">grep 基本的文本查找工具,支持正则表达式</p> <p style="text-align: justify">egrep 拓展grep命令,支持基本和扩展正则表达式</p> <p style="text-align: justify">fgrep 快速grep命令,不支持任何正则表达式,只是按照字符的原意进行匹配</p> <p></p> <p><span style="font-family:Microsoft YaHei UI">其实egrep和fgrep分别可以使用grep -E或者grep -F命令替代</span></p> <p></p> <p> grep [OPTIONS] PATTERN [FILE…]</p> <p> grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]</p> <p>OPTIONS:</p> <p><span style="font-family:Microsoft YaHei UI"> -v</span> 反向选取</p> <p><span style="font-family:Microsoft YaHei UI"> -o</span> 仅显示匹配到的字符串,而非行</p> <p><span style="font-family:Microsoft YaHei UI"> -b</span> 用于配合-o,可显示匹配到字符的偏移值</p> <p><span style="font-family:Microsoft YaHei UI"> -i</span> 忽略字符大小写</p> <p><span style="font-family:Microsoft YaHei UI"> -E </span> 支持拓展正则表达式</p> <p><span style="font-family:Microsoft YaHei UI"> -F</span> 忽略所有正则表达式</p> <p><span style="font-family:Microsoft YaHei UI"> -A #</span> 显示匹配行的后#行(#为整数)</p> <p><span style="font-family:Microsoft YaHei UI"> -B #</span> 显示匹配行的前#行</p> <p><span style="font-family:Microsoft YaHei UI"> -C # </span> 显示匹配行的前后各#行</p> <p>PATTERN 匹配模式(当然就是由正则表达式和元字符组成啦)</p> <p>FILE 查找的文件(可以由多个文件组成)</p> <p><span style="font-family:Microsoft YaHei UI"></span>grep同时匹配的文件可以有多个,但匹配模式只能有一个</p> <p></p> <p><span style="font-family:Microsoft YaHei UI">例如:当前目录有如下文件</span><br /><img alt="1.PNG" src="//cto.wang/usr/uploads/2016/07/20160703180310-45.png" title="1431527140295318.png" /></p> <p>输入<span style="font-family: 黑体,SimHei">grep root passwd?</span>和<span style="font-family: 黑体,SimHei">grep root bin passwd?</span>的对比结果</p> <p><img alt="2.PNG" src="//cto.wang/usr/uploads/2016/07/20160703180310-35.png" title="1431527194579655.png" /></p> <p>想必细心地你也发现了FILE一项也可以使用正则表达式</p> <p></p> <p>例1:如果我想查找/proc/partitions中关于设备sda的相关信息,那么你可能要用到精确匹配</p> <p><span style="font-family: 黑体,SimHei"> grep '\<sda\>' /proc/partitions</span> </p> <p> 8 0 20971520 sda</p> <p><span style="font-family:Microsoft YaHei UI">这样就不会匹配到sda设备下的其他分区</span></p> <p><span style="font-family:Microsoft YaHei UI"><br /></span></p> <p>例2:在/etc/profile文件下有许多空白开头的行,可以使用精确匹配来获取它们</p> <p><span style="font-family: 黑体,SimHei">grep "^[[:space:]]\{1,\}" /etc/profile</span></p> <p></p> <p>例3:如何匹配电子邮件地址?</p> <p><span style="font-family:Microsoft YaHei UI">标准的电子邮箱地址一般为 </span> email@mail.com</p> <p><span style="font-family: 黑体,SimHei">grep "[[:alnum:]]\{1,\}@[[:alnum:]]\{1,\}\.[[:alpha:]]\{2,4\}"</span></p> <p><span style="font-family: 黑体,SimHei">[[:alnum:]]\{1,\}</span>表示在@出现之前,[]内的字符组合至少出现一次或多次,而后的<span style="font-size: 10.5pt;line-height: 1.5;font-family: 黑体,SimHei">[[:alnum:]]\{1,\}</span><span style="font-size: 10.5pt;line-height: 1.5">也是如此,\.将元字符转义成普通字符,而<span style="font-size: 10.5pt;line-height: 1.5;font-family: 黑体,SimHei">[[:alpha:]]\{2,4\}</span>表示字母长度应该最少出现2次,最多出现4次</span></p> <p><span style="font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p style="line-height: normal">例4:想要匹配ifconfig命令中的IP地址可以使用以下方式</p> <p><span style="font-family: 黑体,SimHei">ifconfig | grep '[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}'</span></p> <p><img alt="3.PNG" src="//cto.wang/usr/uploads/2016/07/20160703180310-23.png" title="1431527269121480.png" /></p> <p><span style="font-family:Microsoft YaHei UI">当然这种方式也会匹配不合法的IP地址,那如果我们想匹配C类地址怎么办呢?(192.0.0.0-223.255.255.254) <br /></span></p> <p><span style="font-family:Microsoft YaHei UI"> </span> </p> <p><span style="font-family: 黑体,SimHei">ifconfig | egrep -o '\<(19[2-9]|2[0-1][0-9]|22[0-3])\>.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>'</span></p> <p><img alt="4.PNG" src="//cto.wang/usr/uploads/2016/07/20160703180310-52.png" title="1431527323647954.png" /></p> <p><br class="Apple-interchange-newline" /></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信