grep命令与正则表达式

grep命令与正则表达式 
什么是grep: 
        grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep支持扩展正则表达式的grep,fgrep快速搜索,不支持正则表达式。 
grep命令: 
    –color:相当于auto,对匹配到的文本进行着色显示 
    -v:显示不被pattern匹配到的行(取反,找出不包含“pattern”的行) 
    -i: 忽略字符大小写 
    -n:显示匹配到的行号 
    -c:显示统计匹配到的行数,等同于wc -l 
    -o:仅显示匹配到的字符串 
    -q:静默模式,不输出任何信息 
    -A # :after ,后#行 (#:数字) 
    -B # :before ,前#行 
    -C # :context, 前后各#行 
    -e :实现多个选项间的逻辑or关系 
    -w:匹配整个单词 
    -E:相当于egrep,支持扩展的正则表达式 
    -F: 相当于fgrep,不支持正则表达式 
正则表达式 
        概念:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 
     目的:

  1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
  2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。 
    特点:
  3. 灵活性、逻辑性和功能性非常的强;
  4. 可以迅速地用极简单的方式达到字符串的复杂控制。

对于刚接触的人来说,比较晦涩难懂。 
正则表达式引擎 
        正则引擎主要可以分为两大类:一种是DFA,一种是NFA。 
DFA 引擎在线性时状态下执行,因为它们不要求回溯(并因此它们永远不测试相同的字符两次)。DFA 引擎还可以确保匹配最长的可能的字符串。但是,因为 DFA 引擎只包含有限的状态,所以它不能匹配具有反向引用的模式;并且因为它不构造显示扩展,所以它不可以捕获子表达式。 
传统的 NFA 引擎运行所谓的“贪婪的”匹配回溯算法,以指定顺序测试正则表达式的所有可能的扩展并接受第一个匹配项。因为传统的 NFA 构造正则表达式的特定扩展以获得成功的匹配,所以它可以捕获子表达式匹配和匹配的反向引用。但是,因为传统的 NFA 回溯,所以它可以访问完全相同的状态多次(如果通过不同的路径到达该状态)。因此,在最坏情况下,它的执行速度可能非常慢。因为传统的 NFA 接受它找到的第一个匹配,所以它还可能会导致其他(可能更长)匹配未被发现。 
元字符分类:字符匹配、匹配次数、位置锚定、分组 
字符匹配: 
        常用选项: 
.         :匹配任意单个字符 
            [abc]:a|b|c 
            [^abc]:除abc之外的字符 
            [:alnum:]:字母和数字 
            [:alpha:]:英文大小写字符 a-z A-Z 
            [:lower:]:小写字母 
            [:upper:]:大写字母 
            [:space:]:专门匹配空格 
        不常用选项: 
            [:cntrl:]:不可打印的控制字符(退格、删除、警铃……) 
            [:digit:]:十进制数字 
            [:xdight:]:十六进制数字 
            [:graph:]:可打印的非空白字符 
            [:print:]:可打印字符 
            [:punct:]:标点符号 
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数 
        * : 匹配前面的字符任意次,0到无穷 
        .*:任意字符出现任意次,比如说 123 456 abc 
        a*:a字符出现任意次 aaaa aa 
        [[:lower:]]*:任意小写字母出现任意次 
        \? :匹配前面的字符出现0次或1次 
            例:a\? 出现0次或1次 
        \+:匹配前面的字符至少1次 
            例:a+ a至少出现1次 
        \{n\}:前面的字符出现n次 
            例:[0-9]\[3\] 000-999 
        \{m,n\}:匹配前面的字符出现m到n次,m、n是一个范围 
        \[,n\]:匹配前面的字符最多出现n 
            例:[0-9]\{,3\}最大匹配是999 
        \{m,\}:匹配前的字符至少出现m次 
            [0-9]\{3,\} 000 无穷 
位置锚定:用来定位字符出现的位置 
        ^ : 锚定行首 
        $: 锚定行尾 
        ^$ :匹配空行的 
        ^[[:space:]] :行首是空白的字符 
        ^[[:space:]]*$:也是空行 
        ^a:以a开头的行 
        b$:以b结尾的行 
        ^a.*b$:以a开头,中间任意字符,以b结尾 
        ^a.*[[:space:]]\{3\}.*b$:以a开头跟任意字符,中间出现三次空格在跟任意字符以b结尾的行 
        ^#:以#开头的行

        \b \b :匹配词首和词尾 

        \< >:匹配次首和词尾 
            \broot \b = \<root \> 
分组:将匹配规则分成不同的组 使用1 2 3 … 等数字去标示,便于后面使用同样规则的时候可以直接引用 
        \| : 或 
            例:a \| b a或b 
扩展正则表达式 
        . :单个字符 
        [ ]:中括号范围内的字符 
        *:匹配前面字符的任意次 
        ?:0或者1次 
        +:1次或者多次 
        {m}:匹配m次 
        {m,n}:至少m次 至多n次 
        |:或者 a|b a或者b 
        ^:行首 
        $:行尾锚定 
        \<,\b:语首 
        \>,\b:语尾 
        ( ):分组 向后引用 \1 \2

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

(0)
上一篇 2017-04-08 17:22
下一篇 2017-04-08 18:23

相关推荐

  • 8.1_Linux管道的使用和用户管理

    什么是管道? 管道就是把命令1的标准输出发送给命令2的标准输入,把命令2发的标准输出发送给命令3的标准输入。。。 最后一个命令会在当前shell进程的子shell进程中执行用来 管道实现了使用目的单一的小程序,组合小程序完成复杂的任务 管道需要配合其他命令的使用 tr命令的使用,常常用于配合管道     -c或–co…

    Linux干货 2016-08-10
  • 学习宣言

    纸上得来终觉浅,绝知此事要躬行博学之,审问之,慎思之

    Linux干货 2016-10-24
  • Homework Week-1 Linux基本

    1、描述计算机的组成及其功能。 计算机由硬件和软件组成;硬件主要分为五部分:控制器,运算器、存储器、输入和输出设备。软件分为系统软件和应用软件。 控制器(Control):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。 运算器(Datapath):运算器的功能…

    Linux干货 2016-08-15
  • Gdevops 2017全球敏捷运维峰会【北京站】限时免费!

    Introduction 全球敏捷运维峰会 打造敏捷与运维领域标杆峰会! 2017年全球敏捷运维峰会(Gdevops, Global Devops Summit)将于2017年在成都、上海、北京、广州四城全面启动,本次Gdevops 2017全球敏捷运维峰会【北京站】由上海市经济和信息化委员会指导,上海市云计算产业促进中心、DBAplus社群主办,数十家媒体…

    Linux干货 2017-08-02
  • 程序包管理之制作yum本地源

    Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。 使用本地yum源有两种方式:第一直接使用光盘镜像,不过此方…

    Linux干货 2016-08-24
  • 初入linux_基础(一)

    初入Linux知识点总结(一) 一、理论知识 1、时间点: 1946年 第一代计算机ENIAC诞生于美国宾州大学,特点:块头大、效率低 数学家冯诺•依曼提出计算机体系结构组成部分:计算器、运算器、存储器、输入设备、输出设备 1969年 UNIX在美国贝尔实验室诞生 1984年 GNU项目和软件基金会成立 1991年 Linux在芬兰赫尔辛基诞生 2、计算机的…

    Linux干货 2017-02-18

评论列表(1条)

  • renjin
    renjin 2017-04-12 13:20

    详细介绍了grep命令与正则表达式的使用,内容写的非常详细,但需要注意一下排版的问题,也可以适当的加入图片