首页 > 代码库 > #7 shell脚本编程之正则表达式

#7 shell脚本编程之正则表达式

    多命令执行方法:

    脚本组成;

      1.shengbang

      2.#

      3.空白行——没有任何内容的行、只包含空白字符或制表符(TAB)

      4.逻辑判断


    shell脚本编程:

      1.加执行权限,通过路径来调用脚本;

      2.利用解释器直接执行;


  本文处理工具:

    vim、vi、nano 


  文本处理三剑客:

    grep系:

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

    

    sed:stream editor,流数据器,行编辑器,文本编辑工具;


    awk:gawk,——gun awk,文本格式化工具,文本报告生成器,文本处理的编程语言;


    cut、sort


grep系:

  grep

  egrep

  fgrep


  grep:global search regular expression and print out the line。

          利用正则表达式进行全局搜索并将匹配的行显示出来; 

       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=auto

           -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的行的同时显示其后面的num行;

           -B NUM, --before-context=NUM:在显示匹配pattern的行的同时显示其前面的num行;

           -C NUM, -NUM, --context=NUM:在显示匹配pattern的行的同时显示其前后各num行;


         pattern:

           正则表达式元字符:

             基本的正则表达式元字符:

             globbing--------简化版的正则表达式:[] ? *


             字符匹配:

                . :匹配任意单个字符;

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

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

              下列所有的字符集都可以放置于[]之中用于匹配单个字符;

                     [:lower:]:表示所有小写字字母;

                       [[:lower:]]:通配任意单个小写字母;

                     [:upper:]:表示所有的大写字母;

                       [[:upper:]]:通配任意单个大写字母;

                     [:alpha:]:表示所有字母字符;

                     [:digit:]:表示所有的十进制数字;    10

                     [:alnum:]:表示所有的大小写字母以及十进制数字;

                     [:space:]:表示空白字符;

                     [:punct:]:表示所有的标点符号;

                     [:blank:]:表示空白字符;

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

                     a-z:所有的小写字母;

                     A-Z:所有的大写字母;

                     0-9:所有的十进制数字;


             次数匹配:该类字符之前的那个字符可以出现的字数;

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

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

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

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

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

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

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


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


             位置锚定字符:

               行锚定:

                 行首锚定:^

                 行尾锚定:$

               字锚定:

                 字首锚定:\<或\b

                 字尾锚定:\>或\b    

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


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


             分组与引用字符:

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


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


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


                 \1:pattern2

                 \2:pattern4                                     

                 \3:pattern5


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

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

                 ...


                 请找出在/etc/passwd中用户的UID和GID相同的用户账户;

                 grep ‘\(\<[[:digit:]]\+\>\).*\1‘ /etc/passwd:设置和查看用户的密码信息;


             或:

                  \|


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


                  A\|american:A或american


                 请找出ifconfig命令的执行结果中数值在100-255之间的整数;

                  

                 第一位: 1    2

                 第二位:0-9  0-4  5

                 第三位:0-9  0-9  0-5


                 ifconfig | grep ‘\<1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\>‘

                 请找出ifconfig命令执行结果中数值在0-255之间的整数


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


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

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


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


       egrep:

         egrep [OPTIONS] PATTERN [FILE...]

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

             字符匹配:

               .

               []

               [^]


             次数匹配:

                *

                ?

                +

                {m}

                {m,n}

                {m,}

                {0,n} 


             位置铆钉:    

                ^

                $

                \<,\b

                \>,\b


             分组和引用:

                ()

                \1,\2,\3,...


             或:

                |


       fgrep:pattern中所有的字符都被当作文本字符来处理;


    其他的文本处理命令;

       wc:统计一个文件中的行数、字数及字节数;

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

          wc [OPTION]... --files0-from=F

               -c:只显示字节数;

               -l:只显示行数;

               -w:只显示字数;



       cut:remove sections from each line of files

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

          cut OPTION... [FILE]...

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

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

               地址定界使用方法:

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

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

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

            --output-delimiter=STRING:指定输出符号;


       awk:pattern scanning and processing language

            awk -F "delimiter"‘[/pattern/]{print $1,$2,...$NF}‘ file...

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

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


       sort:sort lines of text files,将文本文件按行继续排序,默认排序规则是按照ASCII表中的字符顺序进行,

       这个排序标准可以修改;

       sort [OPTION]... [FILE]...

       sort [OPTION]... --files0-from=F

                    -r, --reverse:逆序排序

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

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

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

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

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

             

       uniq:report or omit repeated lines

       uniq [OPTION]... [INPUT [OUTPUT]]

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

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

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

 

       diff:compare files line by line

       diff [OPTION]... FILES

                    同一文件的不同修改版本:打补丁;

                   

       patch:apply changes to files

       patch [-blNR][ -c| -e| -n][-d dir][-D define][-i patchfile]

               [-o outfile][-p num][-r rejectfile][file]


#7 shell脚本编程之正则表达式