zoukankan      html  css  js  c++  java
  • [转载]第八章  grep 家族

        g r e p(全局正则表达式版本)允许对文本文件进行模式查找。如果找到匹配模式, g r e p打印包含模式的所有行。g r e p支持基本正则表达式,也支持其扩展集。g r e p有三种变形,即:
        G r e p:标准g r e p命令,本章大部分篇幅集中讨论此格式。
        E g r e p:扩展g r e p,支持基本及扩展的正则表达式,但不支持 q模式范围的应用,与之相对应的一些更加规范的模式,这里也不予讨论。
        F g r e p:快速g r e p。允许查找字符串而不是一个模式。不要误解单词f a s t,实际上它与g r e p速度相当。

    grep

        g r e p一般格式为:
        grep [选项]基本正则表达式[文件]
        这里基本正则表达式可为字符串。

    双引号引用

        在g r e p命令中输入字符串参数时,最好将其用双引号括起来。例如:“m y s t r i n g”。这样做有两个原因,一是以防被误解为s h e l l命令,二是可以用来查找多个单词组成的字符串。

        在调用变量时,也应该使用双引号,诸如: g r e p“$ M Y VA R”文件名,如果不这样,将没有返回结果。

        在调用模式匹配时,应使用单引号。

    grep选项

        常用的g r e p选项有:

        -c 只输出匹配行的计数。
        -i 不区分大小写(只适用于单字符)。
        -h 查询多文件时不显示文件名。
        -l 查询多文件时只输出包含匹配字符的文件名。
        -n 显示匹配行及行号。
        -s 不显示不存在或无匹配文本的错误信息。
        -v 显示不包含匹配文本的所有行。

    查询多个文件

        如果要在当前目录下所有. d o c文件中查找字符串“ s o r t”,方法如下:
        $ grep "sort" *.doc

    行匹配

        $ grep -c "48" data.f
        $ 4
        g r e p返回数字4,意义是有4行包含字符串“4 8”

    行数

        显示满足匹配模式的所有行行数:
        grep -n "48" data.f

    显示非匹配行

        显示所有不包含4 8的各行:
        grep -v "48" data.f

    精确匹配

         使用g r e p抽取精确匹配的一种更有效方式是在抽取字符串后加 >。假定现在精确抽取4 8,方法如下:
         grep '48>' data.f

    大小写敏感

         缺省情况下, g r e p是大小写敏感的,如要查询大小写不敏感字符串,必须使用- i开关。d a t a . f文件中有月份字符S e p t,既有大写也有小写,要取得此字符串大小写不敏感查询,方法如下:
         grep -i "sept" data.f

    grep和正则表达式

        使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选择。使用正则表达式时最好用单引号括起来,这样可以防止g r e p中使用的专有模式与一些s h e l l命令的特殊方式相混淆。

    模式范围

        假定要抽取代码为4 8 4和4 8 3的城市位置,上一章中讲到可以使用[ ]来指定字符串范围,这里用4 8开始,以3或4结尾,这样抽出4 8 4或4 8 3。
        grep '48[34]' data.f

    不匹配行首

        如果要抽出记录,使其行首不是4 8,可以在方括号中使用^记号,表明查询在行首开始。
        grep '^[^48]' data.f

    设置大小写

        使用- i开关可以屏蔽月份S e p t的大小写敏感,也可以用另一种方式。这里使用[ ]模式抽取各行包含S e p t和s e p t的所有信息。
        grep '[Ss]ept' data.f

    匹配任意字符

         如果抽取以L开头,以D结尾的所有代码,可使用下述方法,因为已知代码长度为5个字符:
         grep 'K...D' data.f

    范围组合

        grep '[0-9][0-5][0-6]' data.f

    模式出现机率

        抽取包含数字4至少重复出现两次的所有行,方法如下:
        grep '4{2,}' data.f

    使用grep匹配“与”或者“或”模式

        g r e p命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:
        grep -E '219|216' data.f

    匹配特殊字符

        查询有特殊含义的字符,诸如$ . ' " * [] ^ | + ? ,必须在特定字符前加。
        grep '.' myfile

    查询格式化文件名

        使用正则表达式可匹配任意文件名。系统中对文本文件有其标准的命名格式。
        grep '[a-z]{1,6}.[A-Z]{1,2}' filename.deposit

    类名
        g r e p允许使用国际字符模式匹配或匹配模式的类名形式。
       
        类名及其等价的正则表达式
        [ [ : u p p e r : ] ] [ A - Z ]         [ [ : a l n u m : ] ] [ 0 - 9 a - zA-Z]
        [ [ : l o w e r : ] ] [ a - z ]         [ [ : s p a c e : ] ] 空格或t a b键
        [ [ : d i g i t : ] ] [ 0 - 9 ]         [ [ : a l p h a : ] ] [ a - z A - Z ]

        g r e p中通配符*的使用
        使用grep 'l.*s' testfile 可匹配 looks  likes

    系统grep命令

        系如果要查询目录列表中的目录,方法如下:
        ls -l | grep '^d'

        如果在一个目录中查询不包含目录的所有文件,方法如下:
        ls -l | grep '^[^d]'

        使用g r e p命令- s开关,可屏蔽错误信息。

        如果g r e p命令不支持- s开关,可替代使用以下命令:
        grep "louise" /etc/passwd > /dev/null 2>&1
        脚本含义是匹配命令输出或错误( 2 > $ 1),并将结果输出到系统池。大多数系统管理员称/ d e v / n u l l为比特池,没关系,可以将之看成一个无底洞,有进没有出,永远也不会填满。

    egrep

        e g r e p代表e x p r e s s i o n或extended grep,适情况而定。e g r e p接受所有的正则表达式, e g r e p的一个显著特性是可以以一个文件作为保存的字符串,然后将之传给e g r e p作为参数,为此使用- f开关。
        egrep -f grepstrings data.f
        当匹配大量模式时, - f开关很有用,而在一个命令行中敲入这些模式显然极为繁琐
       
        如果要查询存储代码3 2 L或2 C C,可以使用(|)符号,意即“|”符号两边之一或全部。
        egrep '{32L|2CC}' data.f
        可以使用任意多竖线符“ |”,
        who | egrep (louise|matty|qauline)

        还可以使用^符号排除字符串。如果要查看系统上的用户,但不包括m a t t y和p a u l i n e,方法如下:
        who | egrep -v '^(matty|pauline)'

        如果要查询一个文件列表,包括s h u t d o w n、s h u t d o w n s、r e b o o t和r e b o o t s,使用e g r e p可容易地实现。
        egrep '(shutdown|reboot)(s)?' *

  • 相关阅读:
    常见的兼容问题
    css3新增伪类
    完美的js运动框架
    C++ 常用宏
    多线程代码段 自清理线程
    寒假自学(十一)
    寒假自学(十)
    寒假自学(九)
    寒假自学(八)
    寒假自学(七)
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7481035.html
Copyright © 2011-2022 走看看