【linux】正则表达式之grep、egrep、元字符

正则表达式:

    又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。是一类字符所书写的模式,其中许多字符(元字符)不表示其字面意义,而是表达控制或通配等功能。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

语法:

    grep [OPTIONS] PATTERN [FILE…]

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

    如:/etc/passwd中以root开头的行,及其后面的两行

   blob.png

    -A 2为OPTIONS,命令选项;^root为PATTERN,其中root为字面意思,^为元字符;/etc/passwd为FILE

正则表达式分类:

    根据元字符数量及功能的不同分为基本正则表达式(grep)、扩展正则表达式(egrep)。grep和egrep都是文本搜索工具,可根据用户指定的文本模式(搜索条件,即:文本+元字符)对目标文件进行逐行搜索,显示能匹配到的行;用法上grep -E等同于egrep。此外还有一个文本搜索工具fgrep,不支持正则表达式,没有自己的元字符,不做详细解释。

    在搜索工具中,元字符起到至关重要的作用;元字符即,不表示其字面意义,而用于额外功能性描述。

正则表达式元字符:

    grep元字符:

        1.字符匹配:

        .: 匹配任意单个字符

        []: 匹配指定范围内的任意单个字符

        [0-9], [[:digit:]]

        [a-z], [[:lower:]]

        [A-Z], [[:upper:]]

        [[:space:]]匹配空白字符,包括空格,tab…

            Space characters (such as space, tab, and formfeed, to  name a few).

            tab, newline, vertical tab, form feed, carriage return, and space. 

        [[:punct:]]匹配任意标点符号:: '! " # $ % & ' ( ) * + , – . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~'. 

            Punctuation characters (characters that are not letter, digits, control characters, or space characters).

        [[:alpha:]]字母数字符

        Alphabetic characters.

        [[:alnum:]]匹配任何字母 

        Alphanumeric characters.

        [^]:代表本表达式不匹配"[]"内出现的字符

        2.次数匹配元字符:

    用于实现指定其前面的字符所能够出现的次数

    *: 任意长度,它前面的字符可以出现任意次

    \?: 0次或1次,它前面的字符是可有可无的

    \{m\}: m次,它前的字符要出现m次

    \{m,n\}: 至少m次,至多n次

    \{m,\}:至少m次

    \{0,n\}: 至多n次

    .*:任意长度的任意字符

        3.位置锚定:

    ^: 行首锚定;写在模式最左侧

    $: 行尾锚定:写在模式最右侧

    ^$: 空白行

        4.分组:

    \(\)

    例如:\(ab\)*

    分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用

        5.引用:

    例如\(ab\(x\)y\).*\(mn\)

    有编号:自左而后的左括号,以及与其匹配右括号

    \(a\(b\(c\)\)mn\(x\)\).*\1

    \#: 引用第n个括号所匹配到的内容,而非模式本身

    例如:      blob.png

    引用第一个分组的内容为\(w\(es\)t\)

    引用第二个分组的内容为\(es\)

    也可以看出正则表达式是工作在贪婪模式下,会尽可能多的匹配

        6.补充:

    不包含特殊字符的连续字符组成的串叫单词:

    \<: 词首,出现于单词左侧,\b

    如:\<char

    \>: 词尾,出现于单词右侧, \b

    如:char\>

    egrep元字符:

        1.字符匹配:

    .:任意单个字符

    []:匹配范围内的任意单个字符

    [^]:匹配范围外的任意单个字符

        2.次数匹配:

    *:任意次

    ?: 0次或1次

    +: 至少1次;

    {m}: 精确匹配m次

    {m,n}: 至少m次,至多n次

    {m,}:至少m次

    {0,n}:至多n次

        3.锚定:

    ^:行首

    $:行尾

    ^$, ^[[:space:]]*$:空白行

        4.分组:

    ()

        5.引用:

    \1, \2, \3

        6.或者:

    a|b: a或者b

    con(C|c)at

        7.补充

    \<, \b

    \>, \b

    grep与egrep区别

        grep的扩充版本, 改良了许多传统 grep 不能或不便的操作. 比方说:

        grep 之下不支持 ? 与 + 这两种 modifier, 但 egrep 则可.

     blob.png

        grep 不支持 a|b 或 (abc|xyz) 这类"或一"比对, 但 egrep 则可.        blob.png

        grep 在处理 {n,m} 时, 需用 \{ 与 \} 处理, 但 egrep 则不需.      blob.png

    fgrep:特别搜索

        无元字符,字符表示字面意思。

命令选项:

    -v: 反向选取,即不包含

    -o: 仅显示匹配的字串,而非字串所在的行

    -i: ignore-case,忽略字符大小写

    -E: 支持使用扩展正则表达式

    -A #:Print  NUM  lines of trailing context after matching lines.

    -B #:Print NUM lines of leading context before matching lines.

    -C #:Print NUM lines of output context.  Places a line containing a group separator (–) between contiguous groups of matches.


根据马哥随笔,参考(http://www.178linux.com/archives/1198、http://blog.sina.com.cn/s/blog_51dc0fba0100lqu8.html)及度娘整理。

初次发博客,如有遗漏、错误烦请告知~


原创文章,作者:jiangyali518,如若转载,请注明出处:http://www.178linux.com/1983

(0)
jiangyali518jiangyali518
上一篇 2015-04-01
下一篇 2015-04-01

相关推荐

  • Linuxd的发展史

    Linux发展史 Linux诞生:   1991年的八月,一个芬兰的名为Linus Torvalds的大学生为自己开始写作一个类似minix,可运行在386上的操作系统寻找志同道合的合作伙伴。FREAX系统后改名Linux。  Linux是什么:   按照Linux开发者的说法,Linux是一个遵循POSIX(注一)标作系统,标…

    Linux干货 2016-10-14
  • Linux系统下的翻译神器——Goldendict

    Linux系统下的翻译神器——Goldendict 学习Linux时明显感受到学习英文的重要性。绝大多数Linux的发行版英文版的功能要远强于中文。因此一款好的翻译软件是了解熟悉Linux系统的必需品。在Windows系统下有各种好用的词典程序,包括有道词典、bing词典、金山词霸等等,而这些软件都不能在linux下使用,即使能够使用也只是测试版,功能太少。…

    Linux干货 2017-04-24
  • python面向对象学习第一周

     面向对象的思想 一个具体对象的属性方法,都有各个来源,来源于类,比如消化类,有各种各样的消化模式,人类的只是其中一种 另一种思想方法,类有各种属性方法,人类有很多的属性,一个人应该包括其中的属性,只是值上可能有不同,不同人群也有他们的特征属性和方法     类是对象的抽象,但是类本身也是对象, 对象是一个类的实例. 类的属性:类变量,对象方法,类方法,静态…

    Linux干货 2017-11-13
  • GRUB启动故障排除和内核编译

    如何进入光盘应急系统(以下修复操作仅适用于GRUB legacy, 不适用于GRUB2): 步骤一:给主机挂上安装光盘, 或者有相应启动镜像的硬盘分区(可移动的分区) 步骤二:开机时选择CDROM先启动 步骤三:进入光盘启动界面选择应急救援模式 步骤四: 不选择设置网络接口, 直接读取磁盘分区并以读写方式挂载 步骤五: 选择shell进入bash中对磁盘进行…

    Linux干货 2016-09-12
  • Linux常见发行版本以及Linux哲学思想

    什么是Linux?  Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。  Linux操作系…

    Linux干货 2016-08-15
  • corosync v2+pacemaker实现mariadb的高可用

    高可用mariadb拓扑图 一、设计前提 1、时间同步 # ntpdate 172.16.0.1 或者 # chronyc sources 2、所有的主机对应的IP地址解析可以正常工作, 主机名要与命令#uname -n 所得的结果一致 因此,/etc/hosts中的内容为以下内容         172.16.23.10 node1.rj.com node…

    2017-11-02

评论列表(2条)

  • stanley
    stanley 2015-04-02 22:04

    较上次好了很多,如果能加上段落的标识,代码的格式化,颜色的标识会更好.加油

    • jiangyali518
      jiangyali518 2015-04-02 23:31

      @stanleywhatever,确实不足。感谢提点,会向您提的方向努力~感谢。