正则表达式简述

bashshell中的正则表达式

        俗话说,工欲善其事,必先利其器。由于很多Linux的文本处理工具普遍使用到了正则表达式,因此,不理解正则表达式就无法愉快的从事Linux日常系统管理。那什么是正则表达式呢?

        正则表达式(RegularExpression)主要由普通字符和元字符组成。例如:键盘上的英文字母和数字都属于普通字符,普通字符可以以正常人类思维去理解,a就是英文的小写字母a,Shell没有任何隐藏含义。而^,*,#,这些比较诡异的元字符,Shell赋予了它们超越自身的意义。你可能认为*只是一个乘法符号,但实际上却表示了重复前面的字符0次或多次的隐藏含义。

        实际上,正则表达式在数据流处理的过程中完成的是数据过滤,也就是将满足正则表达式定义的数据留下来,将不满足正则表达式的数据拒绝掉。下面我们来看一看正则表达式能留住哪些元字符

正则表达式:

        *                                       匹配任意个字符,0个或多个

        .                                       匹配任意单个字符

        .*                                      匹配任意字符

        ^                                       匹配行首

        $                                       匹配行尾

        []                                      匹配字符集合

        \<\>                                    精确匹配单词符号

        \{n\}                                   匹配之前的字符n次

        \{n,\}                                  至少匹配之前的字符n次

        \{n,m\}                                 至少匹配之前的字符n次,至多m次

除了上述的正则表达式外,Linux工具中的awk,grep,perl等工具还支持扩展的正则表达式

扩展正则表达式

        ?                        匹配一个或0个在其之前的普通字符

        +                        至少匹配一个在其之前的普通字符,相当于\{1,\}

        ()                       匹配一个字符集合

        |                        表示或,用来匹配一组可选字符串

POSIX字符类

        [:upper:]                表示所有大写字母

        [:lower:]                表示所有小写字母

        [:alnum:]                表示所有大小写字母和数字

        [:space:]                表示空白字符

        [:alpha:]                表示所有大小写字母

        [:digit:]                表示所有数字

        [:cntrl:]                表示Ctrl键

好了,了解了这么多元字符,可以大展身手了,用到正则表达式莫过于grep,egrep,fgrep三兄弟了

grep        基本的文本查找工具,支持正则表达式

egrep       拓展grep命令,支持基本和扩展正则表达式

fgrep       快速grep命令,不支持任何正则表达式,只是按照字符的原意进行匹配

其实egrep和fgrep分别可以使用grep -E或者grep -F命令替代

       grep [OPTIONS] PATTERN [FILE…]

       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

OPTIONS:

    -v        反向选取

    -o        仅显示匹配到的字符串,而非行

    -b        用于配合-o,可显示匹配到字符的偏移值

    -i        忽略字符大小写

    -E         支持拓展正则表达式

    -F         忽略所有正则表达式

    -A #      显示匹配行的后#行(#为整数)

    -B #      显示匹配行的前#行

    -C #      显示匹配行的前后各#行

PATTERN        匹配模式(当然就是由正则表达式和元字符组成啦)

FILE                查找的文件(可以由多个文件组成)

grep同时匹配的文件可以有多个,但匹配模式只能有一个

例如:当前目录有如下文件
1.PNG

输入grep root passwd?grep root bin passwd?的对比结果

2.PNG

想必细心地你也发现了FILE一项也可以使用正则表达式

例1:如果我想查找/proc/partitions中关于设备sda的相关信息,那么你可能要用到精确匹配

 grep '\<sda\>' /proc/partitions 

   8        0   20971520 sda

这样就不会匹配到sda设备下的其他分区


例2:在/etc/profile文件下有许多空白开头的行,可以使用精确匹配来获取它们

grep "^[[:space:]]\{1,\}" /etc/profile

例3:如何匹配电子邮件地址?

标准的电子邮箱地址一般为           email@mail.com

grep "[[:alnum:]]\{1,\}@[[:alnum:]]\{1,\}\.[[:alpha:]]\{2,4\}"

[[:alnum:]]\{1,\}表示在@出现之前,[]内的字符组合至少出现一次或多次,而后的[[:alnum:]]\{1,\}也是如此,\.将元字符转义成普通字符,而[[:alpha:]]\{2,4\}表示字母长度应该最少出现2次,最多出现4次


例4:想要匹配ifconfig命令中的IP地址可以使用以下方式

ifconfig | grep '[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}'

3.PNG

当然这种方式也会匹配不合法的IP地址,那如果我们想匹配C类地址怎么办呢?(192.0.0.0-223.255.255.254)

  

ifconfig | egrep -o '\<(19[2-9]|2[0-1][0-9]|22[0-3])\>.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>'

4.PNG


原创文章,作者:卖糖术士,如若转载,请注明出处:http://www.178linux.com/4377

(0)
上一篇 2015-05-20 17:16
下一篇 2015-05-23 22:14

相关推荐

  • Linux系统之用户和组

    Linux系统之用户和组 1、什么是用户 用户:资源获取标识符,资源分配,安全权限模型的核心要素之一 2、没有用户,操作系统可否正常执行? 答案是肯定的 在Linux系统上,用户管理是基于用户名和密码的方式进行资源的分配, Username/UID分为以下类别:     管理员:root, 0  &…

    Linux干货 2016-08-04
  • 系统管理之程序包管理(二)yum详解

    系统管理之程序包管理(二)yum详解:     上节向大家介绍了程序包管理的理论和rpm命令的使用,本篇文章接着向大家介绍rpm的前端使用工具,方便大家更快捷的管理,使用rpm包,提高工作效率。 一 概论: Centos:yum,dnf 两个rpm前端工具 YUM :yellow dog, Yellowdog,Upda…

    Linux干货 2016-08-24
  • 虚拟化技术介绍、Xen的简单实现

    虚拟化是什么? 虚拟化是一种资源管理技术, 是将计算机的各实体资源, 如服务、网络、内存及存储等, 予以抽象、转换后呈现出来, 打破实体之间的不可切割的障碍, 使用户可以比原本的配置更好的方式来应用这些资源。这些资源的新虚拟部分是不受现有资源的架设方式, 地域或物理配置所限制。一般情况下, 虚拟化资源包括计算能力和数据存储 —<转自维基百科&…

    2016-05-31
  • lvs的四种调度类型和调度算法介绍

    lvs是linux内核级的负载均衡解决方案,作为netfilter的补充套件,其工作在INPUT hook上。 相比nginx等负载均衡解决方案的差异如下: lvs工作于内核空间,不受用户空间套接字和端口数量的限制,而且所有调度工作在内核空间完成,效率更高; nginx为七层负载均衡器,虽然通过stream模块也可以做到四层负载均衡,但是受到套接字数量限制,…

    Linux干货 2017-06-25
  • LVS模型练习

    本次涉及到的练习:nat练习、dr练习、FWM机制练习、mysql集群练习、httpd的集群练习、httpd和mysql结合调度的练习 yum install ipvsadm nat练习     设置:     (1)centos7.2作为lvs调度,有两块网卡,(公网地址)其中…

    Linux干货 2016-10-30
  • 搭建简单的ftp和http

    搭建简单的ftp和http 我们主要尝试光盘和编译两种方式安装 ftp 首先我们先安装ftp ftp可以用来做文件传输,也可以搭建ftp作为我我们的网络yum源 首先我们要先把镜像连接到我们的Linux中 进入/etc/yum.repos.d/创建一个.repo结尾的文件,在里面配置自己的yum源 [base] baseurl=file:///misc/cd…

    2017-06-15