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

7_Shell语言———正则表达式

[复制链接]

尚未签到

发表于 2018-8-30 08:30:34 | 显示全部楼层 |阅读模式
  正则表达式是指一类字符书写的模式(pattern),这类字符为元字符,即该字符不表示本来的意思,而用来作为通配符进行额外功能的描述。如*表示任意长度的任意字符,?表示任意单个字符。
  我们可以使用man命令来查看一下正则表达式中元字符的含义:
  # man 7 regex
DSC0000.jpg

  正则表达式包括两类:基本正则表达式,扩展正则表达式。
  grep命令只支持基本正则表达式;egrep支持扩展正则表达式(e及表示扩展),fgrep表示fast grep,不支持正则表达式,所有的元字符都被当做普通字符处理,搜索速度很快。
  这里着重介绍基本正则表达式。
  前文中介绍过显示出文件 /etc/passwd中所有出现 “root”的行,但如果现在要显示的是只出现在行首的“root”,就需要使用含有元字符的正则表达式了。
  正则表达式的模式主要有以下几种:
  ^pattern :表示锚定行首的符合条件的内容
  故上述情况可以进行以下操作:
  # grep --color=auto ‘^root’ /etc/passwd
  pattern$:表示锚定行尾的符合条件的内容,因为$表示行结束符
  故要查找行尾含有“sh”的行,可进行以下操作:
  # grep --color=auto ‘sh$’ /etc/passwd
DSC0001.jpg

  若^和$同时使用,则可以用来表示自成一行的行,如grep --color=auto ‘^root$’ /etc/passwd就表示只有root出现的这一行;^$更多的时候可以用来查找空白行,如要查找并统计/etc/rc.d/rc.sysinit中的空白行,可以使用以下命令:
  # grep “^$” /etc/rc.d/rc.sysinit
  # grep “^$” /etc/rc.d/rc.sysinit | wc -l DSC0002.jpg
  .:匹配任意单个字符
  *:和通配符中的*号不同,正则表达式中的*表示匹配紧挨在其前面的字符的任意次,如 a*可以表示 a,aa...;a*b可以表示b,ab,aab,而acb不匹配,但是以“a*b”为条件来在查找字符串时,acb则能够匹配,因为它表示b前面的字符串里含有任意个a:
  如进行以下操作:
  # nano grep.txt//输入 a,ab,aab,acb
  # grep --color=auto “a*b” grep.txt
DSC0003.jpg

  .*:表示匹配任意次数的任意字符:和普通的通配符不同,只用*不足以表示任意次数的任意字符,需要在*前面加上.
  如要查找某一行中含有r开头以h结尾字段,可以使用“r.*h”,
  # grep --color=auto “r.*h” /etc/passwd
  # grep --color=auto “^r.*h$” /etc/passwd            //以r开头,以h结尾的行
  # grep --color=auto “^r.*h$” /etc/passwd           //包含以下字段:“r后面跟了一个数字,
  //数字后面跟了任意内容,以h结尾”
  比较有趣的现象是在使用正则表达式进行匹配时,不以首次出现模式进行匹配,而是尽可能长的进行匹配。此模式称为“贪婪模式”
DSC0004.jpg

  []:匹配指定范围内的任意单个字符
  [^]:匹配指定范围外的任意单个字符
  [a-z], [A-Z]:所有的英文字母
  [0-9]:所有的数字
  [:lower:]:所有的小写字母
  [:upper:]:所有的大写字母
  [:digit:]:所有的数字
  [:alpha:]:所有的字母
  [:alnum:]:所有的数字和大小写字母
  [:space:]:所有的空格
  [:punct:]:所有的标点符号
  若表示任意范围内的单个字符,中括号外还需要再套一层中括号,即[[:lower:]]
  # grep --color=auto “r[0-9].*h” /etc/passwd       //包含以下字段:“r后面跟了一个数字,
  //数字后面跟了任意内容,以h结尾”
  # grep “#[[]:space:]]\{1,\}[^[:space:]]” /etc/rc.d/rc.sysinit  //显示/etc/rc.d/rc.sysinit中
  //以#开头,且后面跟一个或
  //多个空白字符,而后又跟了任意非空白字符的行
DSC0005.jpg

\?:匹配紧挨在其前面的字符0次或1次  如 a\?b 可以匹配 ab, aab, acb, b, 在使用命令时,?前面要加上反斜线进行转移,如:
  # grep --color=auto “a\?b” grep.txt
DSC0006.jpg

  \{m,n\}:匹配前面的字符至少m次,至多n次;
  \{0,n\}:匹配至多n次,0-n次;
  \{m,\}:匹配至少m次。
  比如a\{0,3\}b 能匹配b, ab, aab, aaab; aaaaaab 和 acb不匹配,因为b前面至多3个a。
DSC0007.jpg

  如以下例子:
  # grep “[bB].\{2,5\}[tT]” /etc/rc.d/rc.sysinit      // 查找/etc/rc.d/rc.sysinit文件中以大
  //小写任意的B开头,中间跟了2到5
  //个字符,并以大小写任意的T结尾的行
  \ 或 ’pattern’\b:表示锚定词尾,即只匹配指定的单词而后面不包含特殊字符。
  \ 或 \b’pattern’\b:表示锚定单词本身
  例如:
  # grep “\” /etc/rc.d/rc.sysinit
  # grep “\” /etc/rc.d/rc.sysinit
DSC0008.jpg

  \(‘pattern’\):表示分组。例如\(ab\){1,3}可以匹配ab,aab,abb,abab,ababab
  # grep --color=auto “\(ab\)\{1,3\}” grep.txt
DSC0009.jpg

  grep命令在使用正则表达式时也可以引用变量,注意要使用变量,需要用双引号;若使用单引号,则表示寻找引号内的字符串,而不是变量。如:
  # UserName=root// 查找/etc/passwd文件中以root开头的行
  # grep “^$UserName” /etc/passwd DSC00010.jpg
  上述分组匹配也可以引用变量。例如:“ab任意字符ab”可以写作“ab.*ab”。“a.b任意字符a.b”可能出现的结果是“acb_$?_aeb”,但实际希望的效果是 “acb_$?_acb”,这时就可以使用变量来实现:
  # grep \(a.b\).*\1 //这里数字1就是用来引用第一次匹配出来的结果
DSC00011.jpg

  下面看一个有趣的例子,从下列文本中找出以下模式:
  (l开头,两个任意字符,以e结尾)任意字符(和前面的模式一致,但末尾多了一个r)
  He like his liker
  He love his liker
  She love her lover
  She like her lover
  可以进行以下操作:
  # grep “l..e.*l..er” grep.txt
  # grep “\(l..e\).*\1r” grep.txt
DSC00012.jpg



运维网声明 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-558689-1-1.html 上篇帖子: shell学习笔记___1 下篇帖子: shell - sed中如何替换出新行来
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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