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
下一篇 2017-04-08

相关推荐

  • rpm包管理

    rpm包管理 由于 RPM 是透过预先编译打包成为 RPM 文件格式后,再加以安装的一种方式,还能够进行数据库的记载。 所以 RPM 有以下的优点: RPM 内含已经编译过的程序与配置文件等数据,可以让用户免除重新编译的困扰; RPM 在被安装前,会先检查系统的硬盘容量、操作系统版本等,可避免档案被错误安装; RPM 档案本身提供软件版本信息、相依属性软件名…

    Linux干货 2016-08-21
  • N25-第三周作业

      alias NAME='COMMAND'           定义命令的别名—对当前用户有效  un为解除别名 Which   查看命令别名 Whereis    查看程序的文档和源码路径(-b &nbs…

    Linux干货 2016-12-18
  • 使用replicate-rewrite-db 实现复制映射 + Replicate_Wild_Do_Table实现复制过滤

    实验环境:CentOS7.2 + MySQL5.7 node1(192.168.2.171)和node2(192.168.2.172) 为两台不同业务的MySQL服务器。 业务方有个需求,需要将node1上的employees库的departments 、dept_manager 这2张表同步到 node2 的 hellodb 库下面。 node1的empl…

    Linux干货 2017-05-06
  • 转载:UEFI和BIOS对比

    传统BIOS开机流程     从你按下主机机壳上的电源键,到进入作业系统的期间,储存于主机板上那颗EEPROM(电气可抹除暨可程式化唯读记忆体)里的BIOS便会开始执行以下的工作: 1. 初始化:     当电脑打开,CPU会自行重置为初始状态,准备运作。BIOS boot block(基本输出输入…

    Linux干货 2016-05-01
  • 五.Linux博客-2016年7月28日索引、硬链接、软连接、inode表、file、重定向、tr、管道、用户、组

    格式说明: 操作 概念 命令 说明及举例 五.索引、硬链接、软连接、inode表、file、重定向、tr、管道、用户、组 索引节点 原数据保存在inode table表中每个文件或目录都有一个独立的inode number(节点编号在一个分区中是唯一的,每个分区都有自己的inode table) ls -i 查看节点编号 硬链接 ln&n…

    Linux干货 2016-08-23

评论列表(1条)

  • renjin
    renjin 2017-04-12 13:20

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