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

[经验分享] GNU/Linux平台上正则表达式的简单使用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-4-2 08:28:01 | 显示全部楼层 |阅读模式
  友情提醒:本博文涉及的内容中涉及到的系统实践操作在Centos6.5上实现,GNU/Linux简称为linux,GNU/grep简称为grep,GNU/sed简称为sed,GNU/gawk简称为awk。-------------------------------------------------楔子---------------------------------------------


    小酒馆一角落,一胖三瘦围着方桌坐定,大快耳颐后正在唠嗑。
    瘦子甲:“胖子,为什么要把正则表达式和linux联系在一起?”
    胖子:“因为下面的内容是在linux平台上正则表达式的简单使用。”
    瘦子乙:“你认为linux平台上正则表达式很重要?”
    胖子:“重要性无需质疑,linux的两大特性:①一切皆文件。②使用文本文件保存服务配置。就决定了正则表达式和它的三个好基友,grep/sed/awk的组合在处理文件搜索,替换,生成报告文件时,无往而不利。”
    瘦子丙:“胖子,你再不开始讲正题,这顿饭你请。”
    胖子:“容我在啰嗦一句,linux上正则表达式的使用,是个被写烂的题材,下文若有雷同,纯属巧合,牛人请自闪,约架请先向公安备案。”
----------------------------------正文----------------------------------------------   


     请先允许我简要介绍下grep这个工具,不然正则表达式没法演示。
    1. Grep是个搜索工具,可根据使用者定义的PATTEN,逐行搜索文本或者管道传递的数据,若行中有匹配PATTEN模式的字符串,则该行被打印出来(grep默认行为)。这个PATTEN可以是字符串,或者是使用正则表达式元字符组合的模式。
    例如:在/etc/password文件中搜索含有root字符串的行。
[lijun@Test02 test]$ grep --color=auto 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[lijun@Test02 test]$
     看是不是很方便的就将含有root字符串的行搜索出来了?!
    2.grep的语法格式:
       grep [option] 'PATTEN' [FILE...]
           常用选项:
                --color=auto :使用该选项可使匹配的字符串变色显示。
                -E:使用扩展的正则表达式。
                -o: 只显示行中匹配到模式的字符串,而不显示其他的内容。
                -v:反向显示,显示那些不含匹配模式字符串的行。
                -i:匹配时忽略字符大小写。
                -B #:#是数字,显示匹配的行及改行上面的#行。
                -C #:#是数字,显示匹配的行及改行上下的#行。
                -A #:#是数字,显示匹配的行及改行下面的#行。
            *其它的选项请自行使用$man grep 查看。
            *模式PATTEN建议使用'' 号或者""号括起来

        举例:
                生成测试文件及内容:
[lijun@Test02 test]$ cat<<EOF>t1file.txt
> who are you?
> My name is Brad Pitt.
> Your phone number is:135456789
> yes,sir
> EOF
[lijun@Test02 test]$
                2.1)显示grep默认行为:搜索含有you字符串的行
[lijun@Test02 test]$ grep 'you' t1file.txt
who are you?
[lijun@Test02 test]$
默认情况下只显示了含有you的行,不含有you字符串的行不显示,且you没有变色。
                2.2)实行匹配字符串变色显示:搜索含有you字符串的行
[lijun@Test02 test]$ grep --color=auto 'you' t1file.txt
who are you?
[lijun@Test02 test]$
这下看的可以明显清晰易辨别。
                2.3)忽略字符大小写:搜索含有you字符串的行
[lijun@Test02 test]$ grep -i --color=auto 'you' t1file.txt
who are you?
Your phone number is:135456789
[lijun@Test02 test]$
使用选项-i后,搜索范围又一步加大了。
                2.3)测试-v:搜索不含有you字符串的行
[lijun@Test02 test]$ grep -v -i 'you' t1file.txt
My name is Brad Pitt.
yes,sir
[lijun@Test02 test]$
[lijun@Test02 test]$ grep -v 'you' t1file.txt
My name is Brad Pitt.
Your phone number is:135456789
yes,sir
[lijun@Test02 test]$
为了让看得清使用的选项个数,这里没有将-v和-i合并使用。
                2.4)测试下选项 -C#:显示含有name字符串行,及该行上下各1行
[lijun@Test02 test]$ grep -C1 --color=auto 'name' t1file.txt
who are you?
My name is Brad Pitt.
Your phone number is:135456789
[lijun@Test02 test]$
-A#,-B#同-C#使用方式没有区别,这里就不测试了。
                2.5)测试-E选项:含有字符串you或者You的行
[lijun@Test02 test]$ grep -E --color=auto '(y|Y)ou' t1file.txt
who are you?
Your phone number is:135456789
[lijun@Test02 test]$

    3.正则表达式
    正则表达式,又称:Regular Expression,RE。计算机科学中的一个概念,它由一堆元字符组成,
再配合人类的思维,可以使用有限的元字符组合,表达一系列符合某些语法模式的字符串,在文本处理
领域中可用来检索,借助其他工具替换符合模式的字符,并按照一定的预设格式显示出来。
    正则表达式分为:基本正则表达式和扩展正则表达式。
    基本正则表达式中元字符:
         =======匹配字符,数字和符号=========
         .:表示任意单个字符
        [ ]:表示指定范围内的任意单个字符,例如:[0-9]表示0到9中任意单个数字
        [^ ]:表示指定范围外的任意单个字符,例如:[^0-9]表示非数字的任意单个字符
        [[:digit:]] :0到9数字中任一个
        [[:lower:]] :小写字母中任一个

        [[:upper:]] :大写字母中任一个
        [[:alpha:]] :大小写字母中任一个
        [[:alnum:]] :字母数字中任一个

        [[:punct:]] :标点符合中任一个

        [[:space:]] :任一空白字符
         =======匹配字符出现的次数===========
         \*:左边的字符出现任意次
         \?:左边的字符出现0次或1次
         \+:左边的字符出现至少1次
         \{m,n\}:左边的字符出现m到n次
         \{m,\}:左边的字符出现至少m次
         \{0,n\}:左边的字符出现至多n次

         =======锚定位置=======================
         ^:表示右边的字符出现在行首
         $:表示左边的字符出现在行尾
         \< :表示右边的字符出现在单词首部,可使用\b代替
         \> : 表示左边的字符出现在单词尾部,可使用\b代替
          \<WORD\>:绝对匹配WORD的单词
         ========分组与引用====================
          \(PATTEN\): PATTEN当作一个整体出现
          \(P1\).....\1....:\1的位置出现一个同前边P1一模一样的字符

          举例:
             3.1)行首匹配符号^:显示/etc/passwd文件中root位于行首的行
[lijun@Test02 test]$ grep --color '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[lijun@Test02 test]$
             3.2)行尾匹配符$:显示/etc/passwd文件中bash位于行尾的行
[lijun@Test02 test]$ grep --color 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lijun:x:500:500:lijun,115,110,119:/home/lijun:/bin/bash
[lijun@Test02 test]$
            3.3)锚定词首符\< 锚定词尾符\> :在/etc/passwd 文件中显示包含以r开头,t结尾,中间2个任意字符的单词的行。
[lijun@Test02 test]$ grep --color=auto '\<r..t\>' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[lijun@Test02 test]$

          3.4)显示.与*的组合使用以及贪婪模式: 在/etc/passwd 文件中显示包含以r开头,t结尾,中间任意字符的单词的行。         
[lijun@Test02 test]$ grep --color=auto '\<r.*t\>' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[lijun@Test02 test]$
在显示的第一行中匹配那么长,是因为正则表达式的贪婪模式所致。
           3.5)范围符号[]的使用:显示/proc/meminfo中以s开头的行
[iyunv@Test02 tt]# grep --color=auto '^[sS]' /proc/meminfo
SwapCached:            0 kB
SwapTotal:       1063928 kB
SwapFree:        1063928 kB
Shmem:               172 kB
Slab:             101220 kB
SReclaimable:      46408 kB
SUnreclaim:        54812 kB
[iyunv@Test02 tt]# grep -i  '^s' /proc/meminfo
SwapCached:            0 kB
SwapTotal:       1063928 kB
SwapFree:        1063928 kB
Shmem:               172 kB
Slab:             101228 kB
SReclaimable:      46412 kB
SUnreclaim:        54816 kB
             3.6)分组和引用演示:搜索下面文档每行中均有以l开头,e结尾中间任意字符的单词,要求行首同行尾单词相同的行
[iyunv@Test02 tt]# cat 3.txt
she is my love,isn't your love
I like her leg,but she is your love
she is not my love,but her phone as my like
I like dog,but she like cat

[iyunv@Test02 tt]# grep --color '\(\<l..e\>\).*\1' 3.txt
she is my love,isn't your love
I like dog,but she like cat
行中的那些非l开头e结尾的单词被模式.*匹配无法除去

    扩展的正则表达式:
    使用扩展正则表达式使用grep -E 或者 egrep

         =======匹配字符,数字和符号=========
             与基本正则表达式相同

        =======锚定位置=======================
             与基本正则表达式相同

         =======匹配字符出现的次数===========
         *:左边的字符出现任意次
         ?:左边的字符出现0次或1次
         +:左边的字符出现至少1次
         {m,n}:左边的字符出现m到n次
         {m,}:左边的字符出现至少m次
         {0,n}:左边的字符出现至多n次

         ========分组与引用====================
          (PATTEN): PATTEN当作一个整体出现
          (P1).....\1....:\1的位置出现一个同前边P1一模一样的字符
          ========选择======================
               a|b:表示a或者b
            例子:
                3.7)写个模式匹配下列邮件地址:
[iyunv@Test02 tt]# cat 2.txt
linuxedu@126.com
LINUXEDU@qq.com
171_7717@qq.com
zhijun-L@163.com is j.com
This is my email:zhijun-L@163.com,and this is my http address:http://www.sina.com


[iyunv@Test02 tt]# grep -i -E --color=auto '\<[[:alnum:]]+(-|_){0,}[[:alnum:]]{0,}\>\@\<[[:alnum:]]+\>\.com' 2.txt
linuxedu@126.com
LINUXEDU@qq.com
171_7717@qq.com
zhijun-L@163.com is j.com
This is my email:zhijun-L@163.com,and this is my http address:http://www.sina.com
[iyunv@Test02 tt]#
                 3.8)写个模式匹配ifconfig eth1中出现的数字:
[iyunv@Test02 tt]# ifconfig eth1|grep --color=auto -E '[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]'
eth1      Link encap:Ethernet  HWaddr 00:0C:29:97:01:8B  
          inet addr:172.16.200.2  Bcast:172.16.200.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe97:18b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12535 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4685 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1144613 (1.0 MiB)  TX bytes:569776 (556.4 KiB)
[iyunv@Test02 tt]#


                3.9)写个模式匹配ifconfig eth1中出现的ip地址和掩码
[iyunv@Test02 tt]# ifconfig eth1|grep --color=auto  -E '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
          inet addr:172.16.200.2  Bcast:172.16.200.255  Mask:255.255.255.0

    好吧,就这些了,上面就是常用到的正则表达式和grep的用法,更详细的请通过书籍,互联网等查询学习。
    感谢老婆送的棒棒糖,让我支撑这写完这篇文章。
----------------------------------小结-----------------------------------------------
    说完上面这些,胖子瞟了一眼在座的3个同伴,看着他们发发蔫的眼神,胖子心中想到:这比诱惑术还好用?下次大餐时,该多准备些awk,sed配合正则表达式的用法,这样以来就不用自己买单了,嘎嘎。
便向店小二喊道:“座上的3个吃完买单”。变抽身翩然而去。

运维网声明 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-53004-1-1.html 上篇帖子: 使用tmpfs实现NFS共享 下篇帖子: Linux正则表达式grep,egrep 及相应的正则表达式用法详解 表达式 Linux
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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