grep、egrep及相应的正则表达式和用法
什么是正则表达式 正则表达式是你定义的、Linux工具用来过滤文本的模式模板。Linux工具(如grep,egrep)能 够在数据流向工具时对数据进行正则表达式模式匹配。如果数据匹配模式,它就会被接受并进一 步处理。如果数据不匹配模式,它就会被过滤掉。示意图如下: 正则表达式基本知识 正则表达式的实现是依靠正则表达式引擎来实现的。 什么是正则表达式引擎?它是解释正则表达式模式并使用该模式进行文本匹配的底层软件。 Linux中有两种主流正则表达式: BRE:基本正则表达式; ERE:扩展正则表达式; 学习正则表达式首先要了解正则表达式的元字符。 ERE元字符与BRE类似,写法更简洁并增加新的元字符。 以上元字符将通过grep(BRE)和egrep(ERE)逐个演示 grep命令简介 grep家族: grep:支持基本正则表达式; egrep:支持扩展正则表达式; fgrep:不支持正则表达式; grep命令: grep [OPTIONS] PATTERN [FILE...]; grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]; 常用参数:
egrep命令: 相当于grep -E 使用方式与grep相似; 正则表达式练习 练习说明 下列练习都大多数没有给出文字解释,个人认为解释是没必要的,一切都在做中学,不理解的 地方仿照例子写几个测试多做几次,这比文字解释更直观。 grep参数使用练习: -i忽略大小写: -v反向匹配: -o只显示匹配内容: -q静默模式: BRE元字符练习 .匹配单个字符 []匹配范围内的任意单个字符 []特殊字符 [^ ]匹配范围外的任意单个字符 *匹配前面的字符任意次(0,1或多次) +匹配前面的字符至少1次(不要忘了“”) ?匹配前面的0次或1次(不要忘了“”): {m}其前面的字符出现m次,m为非负整数(不要忘了“”) {m.n}其前面的字符出现m次,m为非负整数;[m,n] ^行首匹配 $行尾匹配 &;或b匹配单词左侧 &;或b匹配单词右侧 &;word&;匹配整个单词 (x)将此x匹配到的字符当作整体进行处理 n:第n个括号的匹配模式所匹配到的内容 要求匹配like...liker和love...lover 这个需要说明下,按照需求第一印象的匹配方案是l.*e.*l.*r,但这样会匹配love..liker, like...lover。 如果要避免这样的问题,后一个单词的匹配必须使用第一个匹配单词的结果。也就是当 匹配到like后,将like保存,在第二个匹配是直接加上r使用(第二个匹配模式变为liker)。 所以(like)的意思就是匹配到like后,将like保存,通过1(引用第一个括号匹配到的内容) 来建立第二个liker匹配模式。 -------------------------------------------------------------------------------------------- egrep练习 egrep使用扩展正则表达式,所以很多元字符可以简写,如()、{}、+、?。下面补充"|"的 示例,其他的以综合练习为主。 |匹配左边后右边 --------------------------------------------------------------------------------------------- 综合练习1 找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行 综合练习2 找出"fdisk -l“命令的结果中,包含以/dev/后跟sd或hd及一个小字母的行 综合练习3 找出”ldd /usr/bin/cat“命令的结果中文件路径 综合练习4 echo输出一个绝对路径,使用egrep取出其基名 遇到的问题 之前做的时候没有考虑到目录情况,当时的解决方案是第一条指令,当换成目录就就失灵了。 修改方案 在$前添加/?(/出现0或1次)就完美解决。 综合练习5 找出ifconfig命令结果中的1-255之间的整数 方案1 问题 出现超出255的数字和非单个数字 分析原因 从上图可以看出,默认下[0-9]进行全匹配 解决方案 加上单词边界,就明确指定了要匹配数字的位数 最终方案 综合练习6 添加用户bash、testbash、basher及nologin,要求前三个用户的默认shell为/bin/bash, nologin的默认shell为/sbin/nologin,而后找出其用户名与shell名相同的用户 综合练习7 匹配电话号码,模板如下: (123)456-789 (123) 456-789 123-456-789 123.456.789 综合练习8 找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行 尾巴 正则表达式要想达到熟练应用,必须经过大量练习,今后看到好的习题会追加到该文章。 Learn Linux The Hard Way! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |