首页 > 代码库 > 使用正则表达式配合文本搜索工具Grep以及Egrep快速搜索文本
使用正则表达式配合文本搜索工具Grep以及Egrep快速搜索文本
正则表达式: 计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
正则表达式由两类组成:
基本正则表达式与扩展正则表达式
基本正则表达式:
字符匹配
.:匹配单个字符
[]:匹配指定集合中的任意单个字符
[:digit:]:所有数字(0-9)
[:lower:]:所有小写字母(a-z)
[:upper:]:所有大写字母(A-Z)
[:space:]:空白符
[:punct:]:特殊字符
[:alpha:]:所有字母(包含大写字母)
[:alnum:]:包含数字以及大小写字母
[^]:匹配指定集合外的任意单个字符
匹配次数:用于对其前面近邻的字符所能够出现的次数做出限定
*:匹配前面的字符任意次(0,1,.......,N)
\+:匹配前面出现的字符至少一次
\?:匹配前面出现的字符一次或0次
\{m\}:匹配前面出现的字符m次(用户定义)
\{m,n\}:匹配前面的字符最少m次最多n次(用户定义)
.*:任意长度中的任意字符
位置锚定
^:行首锁定
$:行尾锁定
^$:空白行
\<:词首锁定(要查找的内容的左侧:\<用户定义)
\>:词尾锁定(要查找的内容的右侧:用户定义\>)
\<\>:匹配单词
分组
\(\)具有向后引用功能:搜索的内容中,如果使用\(\)进行了分组,程序会在某行文本中检查用户定义的内容,那么在此后面的内容中可直接引用:\#(引用第几个左括号以及其匹配的右括号之间的模式如:\(\(\)\) 如果想使用里面分组的内容则使用\2即可)
扩展正则表达式:
这里只做与基本正则表达式不同的扩展表达式
匹配字数限定:
?:前面的字符0次或1次
+:前面的字符至少一次
{m}:前面的字符m次
{m,n}:至少m次,至多n次
分组()支持向后引用\1 .....\n
“或“
a|b a或b
ab|cd ab或cd
a(b|c)d abd或acd
以下为示例:
0x04:
显示/proc/cpuinfo文件中以c开头的所有行内容
方法:
“grep ‘^c’ /proc/cpuinfo ”
“egrep ‘^c‘ /proc/cpuinfo ”
效果图:
解析:
c开头那么就要锁定行首使用^即可
0x05:
显示/etc/rc.d/rc.sysinit文件中,以#开头并且后面至少跟一个空白字符,并且空白字符后又跟一个非空白字符的字符并且行尾以.结尾
方法:
" grep ‘^#[[:space:]]\+[^[:space:]].*\.$‘ /etc/rc.d/rc.sysinit "
" egrep‘^#[[:space:]][^[:space:]].*\.$‘ /etc/rc.d/rc.sysinit "
效果图:
解析:
以#开头那么就锁定行首使用^然后#后面需要跟一个空白字符并且至少出现一次那么就使用[[:space:]]\+接下来这个空白字符后又跟一个非空白字符那么就使用[^[:space:]](在[:space:]前加个^即可)最后就剩下以.结尾
如果我们直接输入\.的话并不会输出任何内容因为这个文件中并没有内容为”#空白字符^空白字符.这种类型的行”我们必须在\.前面加.*任意长度的任意字符并且在\.后加$以.结尾
注:这里的.用\.表示是因为正则表达式中单个.表示匹配单个的任意字符所以我们需要用\来将它转义为”.”这个标点符号
0x06:
显示/etc/passwd文件中的所有3位数并且找出当前用户名为4个字符并且shell与其相同
方法:
" grep ‘[[:digit:]]\{3\}‘ /etc/passwd | grep ‘\(\<[[:alnum:]]\+\>\).*\1$‘ "
" egrep‘[[:digit:]]{3}‘ /etc/passwd | egrep ‘(\<[[:alnum:]]+\>).*\1$‘ "
效果图:
解析:
刚看题目可能有点晕感觉无从下手,我们可以一步一步过滤先显示出所有的3位数。使用[[:digit:]]显示所有数字(可使用[0-9]代替)然后是3位数肯定要显示三次如果我们不加\{3\}的话那么就会显示passwd中所有的数字到了这一步我们就已经完成一半了
接下来显示用户名与此行最后一个字符串相同的行,我们必须再次过滤内容。首先用户名有可能有数字但是默认shell是没有数字的所以我们不需要使用[:alnum:]这个正则表达式而用[:alpha:],然后用户名是一个字符串(可以看做是一个单词)所以使用单词匹配\<\>既然是单词那么最少要出现一次使用\+,要显示行的内容那么就需要加.*因为用户名和shell中间有许多内容
剩下还有一个分组和向后引用,我们需要用户名和shell相同那么就可以把用户分为一个组如果不加向后引用那么就会匹配与用户名相同的字母结尾所以我们向后引用一次\1并且加个$以与用户名相同的内容结尾结尾。
附加练习:
新建一个文本使用正则表达式显示文本中的ip地址(ip范围:1.0.0.1-223.255.255.224)如果方法正确则不会显示这个ip范围外的任何ip地址
注:ip第四段如果是一位数字那么不能为0如果是3位数字不能为255
实现方法:
" ifconfig| egrep‘\<(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|2[2][0-3])\>)\.((\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|2[5][0-5])\>)\.){2}(\<[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|2[5][0-4]\>)\>‘ 1 " (这里我用的文件名为1可自行更改)
效果图:
这里并没有给出解析如果小伙伴们可以自己分析为什么这么做的话那么以上的正则表达式就会的差不多了。
目测有小伙伴已经晕了,我个人的表达能力不强在这里表示抱歉。正则表达式其实也不难首先要记住每个正则表达式所对应的内容然后再理解题目中的意思而正确使用相应的表达式即可完成操作。
可能刚开始记忆正则表达式比较困难,可以先选择记忆扩展型的正则表达式,因为基本正则表达式大部分需要转义所以使用起来和记忆起来可能会有点混乱,尤其是当基本正则表达特别多的情况下尽量写一步执行一步不然最后执行如果出错的话会特别难排错。
本文出自 “Yxn” 博客,请务必保留此出处http://jyxnt.blog.51cto.com/9581167/1577646
使用正则表达式配合文本搜索工具Grep以及Egrep快速搜索文本