grep、egrep及相应的正则表达式和用法

简介:

grep、egrep及相应的正则表达式和用法


grep系:grep、egrep、fgrep,文本搜索工具,基于“PATTERN”对于给定的文本进行模糊搜索grep系默认工作于贪婪模式下。

grep系:

      grep:利用正则表达式进行全局查找,并将匹配的行显示出来。

       grep [OPTIONS] PATTERN [FILE...]

         PATTERN:过滤条件,是由正则表达式元字符以及没有特殊含义的文本字符组成。

             正则表达式的元字符:会被正则表达式的引擎解释为特殊含义,

                pcre---perl语言的正则表达式引擎

                基本的正则表达式:BRE

                扩展的正则表达式:ERE


              grep默认仅支持基本正则表达式

              egrep默认仅支持扩展正则表达式

              fgrep默认不开启正则表达式引擎

    常用选项:

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

        -v, --invert-match :反向匹配,最终显示的结果是PATTERN不能匹配的行

        -c, --count :统计匹配PATTERN的所有的行数

        -o, --only-matching :关闭贪婪模式,仅显示PATTERN能够匹配的内容

        -q, --quiet, --silent: 安静模式,不输出任何匹配结果。

        --color[=WHEN], --colour[=WHEN] :将匹配PATTERN内容以特殊颜色高亮显示

          --color=outo

        -E, --extended-regexp :扩展的正则表达式 grep -E 相当于 egrep

        -F, --fixed-strings, --fixed-regexp :固定的正则表达式 grep -F 相当于 fgrep

        -G, --basic-regexp :基本的正则表达式 egrep -G 相当于 grep

        -P, --perl-regexp :使用PCRE(perl common regular expression)引擎

        -A NUM, --after-context=NUM :在显示匹配PATTERN行的同时显示其后面的字符行

        -B NUM, --before-context=NUM:在显示匹配PATTERN行的同时显示其前面的字符行

        -C NUM, -NUM, --context=NUM:在显示匹配PATTERN行的同时显示其前后面各字符行

    PATTERN:

       正则表达式的元字符:

          字符匹配:

            . :匹配任意单个字符

              例子:查看/etc/passwd目录下 显示包含roo后面加任意单个字符的行

                   [root@zj06 ~]# cat /etc/passwd | grep "roo."

                   root:x:0:0:root:/root:/bin/bash

                   operator:x:11:0:operator:/root:/sbin/nologin

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

                例如:'[abc]' 可以匹配 "plain" 中的 'a'。

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

                例如:'[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。

       下列所有的字符集都可以放在中括号之中用于匹配单个字符

            [:lower:] 

                例如:查看/etc/passwd目录下 显示包含任意小写字母的行

                      cat /etc/passwd | grep [[:lower:]] 例子下同

            [:upper:]大写字母的行

            [:alpha:]大小写字母的行

            [:digit:]十进制数字的行

            [:space:]水平和垂直的空白字符

            [:alnum:]任意字母和数字

            [:punct:]可打印字符

            [:blank:]空白字符(空格和制表符)

            [:xdigit:]所有的十六进制数字

            a-z 所有的小写字母

            A-Z 所有的大写字母

            0-9 标识所有的十进制数字

       次数匹配:

            该类字符之前的那个字符可以出现的次数

            * :其前面的字符可以出现任意次(0次,1次或者多次)

               例如:查看/etc/passwd目录下,b前面有任意个a的行

                     cat /etc/passwd | grep --color "a*b" 举例下同

            \? :表示其前面的字符可有可无(0次或者1次)

            \+ :其前面的字符至少出现一次(1次或者多次)

            \{m\} :其前面的字符必须出现m次

            \{m,n\} :前面字符至少出现m次,至多出现n次 (m<n)

            \{,n\} :其前面的字符至少出现0次,至多出现n次

                例如:查看/etc/passwd目录下前面是1后面最少0最多跟三个1的行

                     cat /etc/passwd | grep "1\{,3\}"   

            \{m,\} :其前面的字符至少出现m次,多多益善

                例如:查看/etc/passwd 目录下前面是1后面最少跟三个1的行

                     cat /etc/passwd | grep "1\{3,\}"   

                     


        在正则表达式中,表示任意长度任意字符的方法: .* 

                例如:查看/etc/passwd 目录下每行包含o后面的全部内容

                     cat /etc/passwd | grep  o.*         


        位置锚定字符:

            行锚定:

               行首锚定:^ 

                例如:查看/etc/passwd 目录下以root开头的行

                      cat /etc/passwd | grep ^"root"

               行尾锚定:$

                


            字锚定:

               字首锚定: \<或者\b

                 例如:查看/etc/passwd 目录下以ava开头的行

                      cat /etc/passwd | grep '\<ava'

               字尾锚定: \>或者\b

                 例如:查看/etc/passwd 目录下以tcsh结尾的行

                      cat /etc/passwd | grep 'tcsh\>'

               \b:旧版本中的锚定方法,建议不使用


               对于正则表达式引擎来说,字是由非特殊字符组成的连续字符串


        分组与引用字符:

           \(PATTERN\) :将此PATTERN所匹配到的所有字符当做一个不可分割的整体来处理。

           在正则表达式引擎中有一系列的内置变量,这些变量会保存所有分组内的字符信息,用于后项引用。这些变量依次是\1,\2,\3,......

            


            pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)

            \1:pattern2

            \2:pattern4

            \3:pattern5

             \1:第一组小括号中的pattern匹配到的字符

             \2:第二组小括号中的pattern匹配到的字符

             ...

            例如1: "\(ab\(cd\)mn\) \1 \2"【表示:(ab(cd))ab(cd)】

            例如2:“\(a.b\).*\1" 【表示a.b.*a.b,如:amb hello anb】

            例如3:【 表示"\(l..e\).*\1",找出前面以l..e开头,后面同包含一个l..e的行】


                         He like his lover.


                         He like his liker.


                         She love her lover.


                         She love her liker.


           例如4:【表示:\(.*\)\.mp3.*\1\.wvm,找出中间包含#.mp3,而后又有#.wvm(#与前相同)的行】

               play.php?a.mp3?search?a.wmv

                    play.php?where.mp3?hello?when.wmv


        或:

           \|

           注意:\|字符将其左右两边的字符串当做整体来对待,

               例如:找出"fdisk -l“命令的结果中,包含sda1或sda2的行

                    fdisk -l | grep 'sda1\|sda2'

        

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

           默认情况下:grep命令后面只允许有一个pattern,

           如果想要在一次grep搜索过程中写多个pattern,则需要-e选项,每个-e选项只能使用一个pattern作为参数。

           将所需的pattern写入到一个文件中,保证每行只有一个PATTERN,我们就可以使用-f FILE方式来实现多PATTERN匹配

            例如: grep -e "cat" -e "dog"



     egrep

          grep [OPTIONS] PATTERN [FILE...]

          扩展的字符表达式元字符:

            字符匹配:

            .

            []

            [^]

            次数匹配:

            *  任意次

            ?  0次或者1次

            +  至少一次

            {m}  精确匹配m次

               例如:匹配出现两个o的行

                    egrep o{2} /etc/passwd

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

            {m,}  至少m次

            {0,n}  至多n次

            位置锚定:

            ^  锚定行首

            $  锚定行尾

            \<,\b  锚定词首

            \>,\b  锚定词尾

            分组和引用:

            ()

              例如:包含至少一个ab的行

                   egrep '(ab)+' /etc/passwd

            或:

            |

             例如:显示当前系统上root、fedora或user1用户的默认shell;


                   grep -E "^(root|fedora|user1)\>" /etc/passwd | cut -d: -f7

                   或 egrep "^(root|fedora|user1)\>" /etc/passwd |  cut -d: -f7


     fgrep:PATTERN中所有的字符都被当做文本字符来处理


     其他的文件处理命令:

     wc:

        wc[OPTION]...[FILE]...

        -l:只显示行数

        -w:只显示字数

        -c:只显示字符数


       cut:remove sections from each line of files

          能够被cut命令修剪的文件,一般都是具有一定结构或者格式的文本文档:/etc/passwd

          cut OPTION... [FILE]...

          -d, --delimiter=DELIM :指定在实施修剪操作时所依赖的分隔符,默认是空白符。

          -f, --fields=LIST :根据定义的分隔符来指定字段的序号。

          地址定界使用方法:

            # :选择被指定的单个字段

            #,# :离散的多个被指定的单个字段

            #-# :连续的多个被指定的字段

        --output-delimiter=STRING :指定输出分隔符


      awk:

        awk -F "DELIMITER" '[/PATTERN/]{print $1,$2,$3,...$NF}' FILE...

        -F "DELIMITER" :指定字段分隔符,默认为空白字符

        $1,$2,$3,...$NF :根据字段分隔符切割出来的文本片段都存放在相应的内部变量中。


      sort:sort lines of text files将文本文件按行排序,默认的排序规则是按照ASCII表中的字符顺序进行的,这个排序标准可修改。

        -R, --random-sort :随机排序,这种随机算法是非常简陋的不适用于复杂环境

        -r, --reverse :逆序排序

        -u, --unique :重复出现的行,只保留一行。(连续且完全相同的行 叫重复)祛重

        -n, --numeric-sort :以数字的数值大小进行排序

        -t, --field-separator=SEP :指定字段的分隔符

        -k, --key=KEYDEF :指明根据哪个关键字段进行排序,一般和-t同时使用。


      uniq:report or omit repeated lines 报告或者忽略重复的行

        -d, --repeated :只显示重复出现的行,每一组重复出现的行只显示一行。

        -u, --unique :只显示不重复的行。

        -c, --count :在每行以前缀的方式显示重复行的重复次数

   

      diff:compare files line by line                                             

         查看两个文件的差异性同一个文件的不同修改版本:打补丁 


      patch:apply changes to files 接受文件的改变

         patch [-R][-i patchfile] [file]




本文转自 Runs_ 51CTO博客,原文链接:http://blog.51cto.com/12667170/1915777,如需转载请自行联系原作者
相关文章
|
6月前
|
C++ Python
137 python高级 - 正则表达式(re模块的高级用法)
137 python高级 - 正则表达式(re模块的高级用法)
40 0
|
2月前
|
存储 算法 Shell
【Shell 命令集合 文档编辑】Linux 正则表达式匹配 egrep命令使用教程
【Shell 命令集合 文档编辑】Linux 正则表达式匹配 egrep命令使用教程
12 0
|
2月前
|
机器学习/深度学习 Python
请解释Python中的正则表达式是什么?并举例说明其用法。
【2月更文挑战第26天】【2月更文挑战第86篇】请解释Python中的正则表达式是什么?并举例说明其用法。
|
2月前
|
运维 Unix Linux
grep正则表达式搜索
grep正则表达式搜索
17 3
|
5月前
|
Java 计算机视觉
【Java 正则表达式】简单用法,注意点,我学不会正则
【Java 正则表达式】简单用法,注意点,我学不会正则
|
5月前
|
JavaScript 前端开发 物联网
正则表达式的用法(判断是否为手机号格式)
正则表达式的用法(判断是否为手机号格式)
305 1
|
7月前
|
运维 Java 应用服务中间件
【Nginx用法】nginx location正则表达式写法,详解Nginx location 匹配规则(很详细哦)
【Nginx用法】nginx location正则表达式写法,详解Nginx location 匹配规则(很详细哦)
86 0
|
7月前
|
Linux Perl
[笔记]linux grep之正则表达式
[笔记]linux grep之正则表达式
|
8月前
|
Unix Linux
如何在 Linux 中使用 Grep 和正则表达式进行文本搜索?
如何在 Linux 中使用 Grep 和正则表达式进行文本搜索?
199 5
|
9月前
正则表达式的用法
正则表达式的用法
52 1