设为首页 收藏本站
查看: 1829|回复: 0

Shell编程入门进阶之Grep命令及正则表达式知识梳理

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2018-8-30 10:02:28 | 显示全部楼层 |阅读模式
二、正则表达式:  2.1 基本概念:
  正则表达使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。简而言之,正则表达式就是处理字符串的方法,以行为单位进行字符串的处理,通过一些特殊符号的辅助,可以让用户轻松搜索/替换某特定的字符串。
  正则表达式分为两类:基本的正则表达式和扩展的正则表达式。
  2.2 正则表达式详解介绍:
  2.2.1 基本的正则表达式:
  ◆(1)元字符:
.   → 点号,匹配任意单个字符如grep "r..t" /etc/passwd ,表示匹配r和t中间有两个任意字符的内容。
DSC0000.jpg

  [ ]   → 匹配指定范围内的任意单个字符
  如grep "[0-9]" /etc/inittab ,表示匹配0到9中任意一个数字。
DSC0001.jpg

[^]   → 匹配指定范围外的任意单个字符如grep "[^0-9]" file ,表示出了数字,都匹配
DSC0002.jpg

  ◆(2)次数匹配:
注意:grep默认工作在贪婪模式下,即尽可能长的匹配*   → 匹配其前面的字符任意次.*   → 和*组合使用,表示匹配任意字符任意长度(包含0次)。  使用示例:
  如有文本a.txt包含内容如下:
DSC0003.jpg

  使用 grep "a*b" test1,匹配情况如下:
DSC0004.jpg

  使用 grep "a.*b" test1,匹配情况如下:
DSC0005.jpg

  其实就是a开头,b结尾的都被匹配上了。
  \?   → 匹配其前面的字符1次或0次
  使用grep "a\?b" a.txt ,匹配情况如下:
DSC0006.jpg

  注意跟 grep "a*b" test1的区别!!
  \{m\}  → 匹配其前面的字符m次
  \{m,\}  → 匹配其前面的字符至少m次
  \{m,n\}→ 匹配其前面的字符至少m次,至多n次
  \{0,n\}  → 匹配其前面的字符0至n次
  如:\{2,\}  表示匹配至少2次:
DSC0007.jpg

  ◆(3)字符集和:
  [:digit:]→所有数字[0-9]
  [:lower:]→所有小写字母[a-z]
  [:upper:]→所有大写字母[A-Z]
[:punct:]→所有标点符号[:space:]→ 表示空格或tab键[:alpha:]→表示所有字母(包含大小写) [a-zA-Z]  [:alnum:]→表示所有字母和数字[0-9a-zA-Z]
  如匹配/etc/resolv.conf中的所有数字:
DSC0008.jpg

  需要注意的是,这里需要用额外的[ ]将字符合集括起来。
  ◆(4)位置、字符锚定:
^ → 锚定行首,此字符后面的任意内容必须出现在行首  如查找/etc/passwd文件中以root开头的行:
DSC0009.jpg

$锚定行尾,此字符前面的任意内容必须出现在行尾  如查找/etc/passwd中以bash结尾的行:
DSC00010.jpg

^$空白行  如统计/etc/rc.d/rc.sysinit文件中有多少空白行:
DSC00011.jpg

\或\b锚定词尾,其前面的任意字符必须作为单词的尾部出现  \或\b条件\b查找某个独立的单词
  如查找/etc/passwd文件中以r开头,t结尾,中间包含两个任意字符的单词
DSC00012.jpg

  注意与grep "r..t" /etc/passwd结果的区别:
DSC00013.jpg

  如锚定一个精确指定的字符:
DSC00014.jpg

  ◆(5)分组:
\(ab\)表示ab整体作为匹配字符\(ab\)* → 表示ab整体作为匹配字符,且匹配任意次\(ab\)\{1,\}表示ab整体作为匹配字符,且匹配至少一次分组还可以后向引用\1引用第一个左括号以及与之对应的右括号所包括的所有内容  \2引用第二个左括号以及与之对应的右括号所包括的所有内容
  \3引用第三个左括号以及与之对应的右括号所包括的所有内容
  如test2有文本内容如下:
DSC00015.jpg

  grep "\(l..e\).*\1r" test2 表示匹配结果如下:
DSC00016.jpg

  即引用的为前面匹配内容加上r,因此He like his lover这一行就不会被匹配。
2.2.2 扩展的正则表达式:  grep -E 表示支持扩展的正则表达式
  grep -E = egrep
  扩展的正则表达只是在基本的正则表达上作出了小小的一点修改,其修改如下:
  在扩展的正则表达中把\( \)  写成()、\{ \}  写成{ },另外加入了+:次数匹配,匹配其前面的字符至少出现一次,无上限、|: 或者(二取一),其余的都一样, 基本正则表达式,使用( ) { } . ?  |都需要转义,在扩展正则表达中不需要加\,其详细信息如下:
  ◆(1)元字符:
  字符匹配的命令和用法与基本正则表达式的用法相同,这里不再重复阐述。
  ◆(2)次数匹配:
  上述字符匹配中,基本正则表达式与扩张表达式完全相同,但次数匹配就有些不一样了。
  * → 匹配前面字符任意次,与基本正则表达式意义相同
  ? → 匹配其前字符0次或1次,其前面不需要\ 转义
  + → 匹配其前字符至少一次,等于基本正则表达式的  \{1, \}
  {m}  → 匹配其前面的字符m次,等于基本正则表达式的\{m\}
  {m,}  → 匹配其前面的字符至少m次,等于基本正则表达式的\{m,\}
  {m,n}→ 匹配其前面的字符至少m次,至多n次,等于基本正则表达式的\{m,n\}
  {0,n}  → 匹配其前面的字符0至n次,等于基本正则表达式的\{0,n\}   
  ◆(3)字符集和:
  字符集和基本正则与扩展正则通用,在此不在阐述。
  ◆(4)位置、字符锚定:
  用法和基本正则表达式的用法相同,在此不再阐述。
  ◆(5)分组:
  基本正则表达式中支持分组,而在扩展正则表达式中,分组的功能更加强大,也可以说才是真正的分组,用法如下:
(ab)表示ab整体作为匹配字符,等于基本正则表达式的\(ab\)(ab)* → 表示ab整体作为匹配字符,且匹配任意次,等于基本正则表达式的\(ab\)*(ab){1,}表示ab整体作为匹配字符,且匹配至少一次,等于基本正则表达式的\(ab\)\{1,\}分组还可以后向引用\1引用第一个左括号以及与之对应的右括号所包括的所有内容  \2引用第二个左括号以及与之对应的右括号所包括的所有内容
  \3引用第三个左括号以及与之对应的右括号所包括的所有内容
  如egrep "(l..e).*\1r" test2 表示匹配结果如下:
DSC00017.jpg

  除了方便后面引用外,分组还非常方便的可以使用上述次数匹配方法进行匹配具有相同条件的数据。
  如:egrep '^(halt).*\1' /etc/passwd 搜索/etc/passwd中以halt开头,而后面还存在halt的行
DSC00018.jpg

  ◆(6)或者:
  |表示或,如
  a|b 表示匹配a或者b
  B|bike 匹配B或bike,即 | 匹配的是其整个左边或者右边
DSC00019.jpg

  (B|b)ike 匹配Bike或者bike,注意与上一行的区别
DSC00020.jpg

  三、grep,egrep应用小示例:
  3.1 显示~/.bashrc 中以#开头,且后面跟一个或者多个空白符,而后又跟了任意非空白符的行;
DSC00021.jpg

  3.2 显示/proc/meminfo文件中以大小写s开头的行;
DSC00022.jpg

  或者:
DSC00023.jpg

  3.3 取出默认shell为非bash的用户;
DSC00024.jpg

  3.4 取出默认shell为bash的且其ID号最大的用户;
DSC00025.jpg

  3.5 找出/etc/passwd文件中一位数或两位数;
DSC00026.jpg

  3.6 找出ifconfig命令结果中的1到255之间的整数;
DSC00027.jpg

  3.7 查看当前系统上root用户的所有信息;
DSC00028.jpg

  3.8 添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户;
DSC00029.jpg

  3.9 写一个模式,能匹配真正意义上的IP地址;(1.0.0.1--223.255.255.254)
DSC00030.jpg

  Ps:如果本文章对你学习有所帮助,那将是我最大的荣幸;
  若文章中出现任何问题,烦请指出或联系我(QQ:2399447849)
  Thanks!
  


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558780-1-1.html 上篇帖子: shell_ftp自动上传下载 下篇帖子: linux shell编程学习笔记(2)bash的特性或功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表