首页 > 代码库 > 正则表达式

正则表达式

文本处理工具:
     Vim   vi    nano
 文本处理三剑客
Grep系:grep,egrep,fgrep,文本搜索工具,基于“PATTERN”对于给定的文本进行模糊搜索,grep系默认工作于贪婪模式下
Sed:stream editor ,流编辑器,行编辑器,文本编辑工具
Awk:gawk——GUN awk,文本格式化工具,文本报告生成器,文本处理的编程语言,


  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:]
          [:upper:]
          [:alpha:]
          [:digit:]
          [:alnum:]
          [: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:
     语法结构:grep [OPTIONS] PATTERN [FILE...]
      扩展的正则表达式元字符:
             字符匹配:
                .
                []
                [^]
             次数匹配:
                *
                ?
                +
               {m}
               {m,n}
                {m,}
                {0,n}
             位置锚定:
                ^
                $
                \<,\b
                \>,\b
             分组和引用:
                ()
                \1,\2,\3,...
             或:
                |

   Fgrep:PATTERN中所有的字符都当作文本字符来处理ION;

  其他的文本处理命令:
    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....$NF}‘ FILE....
        -F:"DELIMITER"指定字段分隔符,默认为空白字符
         $1,$2,....$NF,根据字段分隔符切割出来的文本片段都存放在相应的内部变量中

    sort:sort lines of text files:
       翻译汉语:将文本文件按行急需排序,默认排序规则是按照ASCII表中的字符顺序进行,这个排序标准可修改
    选项:
      -r, --reverse:逆序排序
      -R, --random-sort:随机排序,这种随机算法是非常简陋的,不适用于复杂环境
      -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
      parch [-R][-i patchfile] [file]


编程语言:
  问题空间:就是使用人类的自然语言描述的任务

  解空间:就是使用编程语言描述任务的实施步骤和显示最终结果

编程思想:能够把编程语言所提供的语法格式,随时随地转换成能够解决问题的思路

对于编程语言的学习:
   1.学习编程语言的语法格式
   2.学习工具的使用(库,命令)
   3.算法
   4.数据结构

学习编程语言的目标:
   将问题空间和解空间对应起来,最直接的办法就是使用解空间的语言习惯来进行思考;

   shell脚本编程:
     shell脚本的内容和格式:
       首行,绝对行首,shebang(解释器程序的绝对路径)
       注释信息,以#占据绝对行首的行
       为了能够在程序中突出程序的功能,适当的添加空白行,以分隔不同功能的源代码块;
       有一定的缩进


   利用bash脚本编程实现算术运算:
     +,-,
     *,/,
     %:模运算,取余数
     **|^


   增强型的算术元算符号:
     +=:let B=B+2   --->   let B+=2
     -=:let B-B=2   --->   let B-=2
     *=:let B=B*2   --->   let B*=2
     /=:let B=B/2   --->   let B/=2
     %=:let B=B%2   --->   let B%=2
   特殊的增强型算术运算:
     let B=B+1   --->   let B+=1   --->   let B++
     let B=B-1   --->   let B-=1   --->   let B--

     B++:先将B的值赋给其他变量,然后自身+1
     ++B:先做自身+1,然后再将B值赋给其他变量


    算术运算方法:
      1.let VAR=算术表达式
          将算术表达式先进行算术运算,并将运算得到的结果保存到变量VAR中 
      2.VAR=$[算术表达式]
          算术表达式中有过有变量引用,可以使用$,也可以省略$;
          例子:SUM=$[C+B]相当于SUM=$[$C+$B]
      3.VAR=$[算术表达式]
          算术表达式中如果有变量引用,可以使用$引用,也可以省略$
      4.expr ARGU1 ARGU2 ARGU3
        ARGU1和ARGU3必须是数值
        ARGU2必须是运算符号
      5.echo "算术表达式" | bc

      注意:*号,在某些情况下需要转义;

      例子:
        统计/etc/fstab,/etc/passwd,/etc/issue三个文件中,以字母r开头的行数的总和;
           echo $[`grep -c "^r" /etc/passwd`+`grep -c "^r" /etc/issue`+`grep -c "^r" /etc/fstab`]


  变量:存储数据的容器
    弱变量,弱类型变量,字符(默认)型,数值型(不包括浮点型)

    条件测试命令:
        test  EXPRESSION
          shell内建命令:

        [ EXPRESSION ]
          外部命令:

        [[ EXPRESSION ]]
          bash的内部关键字:

      注意:这类命令一般没有执行结果,只有执行状态返回值

      test测试命令有三类测试表达式:
        1.数值测试:双目操作符
          -eq:被测试的两个数值,是否相等,相等为真,不等为假;
          -ne:被测试的两个数值,是否不相等,不等为真,相当为假
          -gt:被测试的两个数值,左边的是否大于右边的,大于为真,不大于为假
          -lt:被测试的两个数值,左边的是否小于右边的,小于为真,不小于为假
          -ge:被测试的两个数值,左边的是否大于等于右边的,大于等于为真,小于为假
          -le:被测试的两个数值,左边的是否小于等于右边的,小于等于为真,大于为假

          例子:~/aaa的大小是否小于1000字节
           [root@localhost 桌面]# [ $(ls -l aaa | awk ‘{print $5}‘) -lt 1000 ] && echo ok ||echo "bu ok"


        2.字符串测试
        ==|=:被测试的两个字符串是否相同,相同为真,不同为假;
        !=:被测试的两个字符是否相同,不同为真,相同为假
        >:被测试的两个字符串在ASCII码表中对应的二进制数值,左边是否大于右边,大于为真,小于为假
        <:被测试的两个字符串在ASCII码表中对应的二进制数值,左边是否小于右边,小于为真,大于为假
  注意:>和<必须在[[ EXPRESSION ]](必须两个中括号,切有空格)测试语句中
        =~:被测试的两个字符串,左侧字符串能否被右侧的PATTERN匹配,能匹配为真,不能匹配为假;
     单目操作符:
        -z ‘STRING‘:判断指定的字符串是否为空串,空为真,不空为假
        -n ‘STRING‘:判断指定的字符串是否为非空串,非空为真,空为假

        注意:
           1.通常情况下,字符串要加引号,单引号或双引号,根据实际情况选择即可
           2.[[]]和[]在某些情况下,可能意义不同;
           3.表达式两端以及操作符两端都要有空格;

        3.文件状态测试
           文件的存在性测试,如果被测试的文件存在为真,不存在为假
           -a | -e
             [ -e /backup ]
             [ -a /backup ]
           文件类型测试(先测试存在性)
             -b FILE:被测试的文件是否存在并且是否为块设备,存在且为块设备,否则为假
             -c FILE:被测试的文件是否存在并且是否为字符设备,存在且为字符设备,否则为假
             -d FILE:被测试的文件是否存在并且是否为目录文件,存在且为目录文件,否则为假
             -f FILE:被测试的文件是否存在并且是否为普通文件,存在且为普通文件,否则为假
             -h FILE:被测试的文件是否存在并且是否为符号链接文件,存在且为符号链接文件,否则为假
             -L FILE:被测试的文件是否存在并且是否为符号链接文件,存在且为符号链接文件,否则为假
             -p FILE:被测试的文件是否存在并且是否为管道文件,存在且为管道文件,否则为假
             -S FILE:被测试的文件是否存在并且是否为套接字文件,存在且为套接字文件,否则为假

           文件的访问权限测试;
             -r FILE:被测试的文件是否存在并且当前有效账户是否可读,文件存在并且当前有用户可读为真,否则为假
             -w FILE:被测试的文件是否存在并且当前有效账户是否可写,文件存在并且当前有用户可写为真,否则为假
             -x FILE:被测试的文件是否存在并且当前有效账户是否可执行,文件存在并且当前有用户可执行为真,否则为假

           文件的特殊权限标识测试:
             -u FILE:被测试的文件是否存在并且是否设置了SUID权限,文件存在并且设置了SUID权限为真,否则为假
             -g FILE:被测试的文件是否存在并且是否设置了SGID权限,文件存在并且设置了SGID权限为真,否则为假
             -k FILE:被测试的文件是否存在并且是否设置了STICKY权限,文件存在并且设置了STICKY权限为真,否则为假

           文件的所有权测试:
             -O FILE:被测试的文件是否存在并且其属主是否为当前有效用户,有效为真,否则为假
             -G FILE:被测试的文件是否存在并且其属组是否为当前有效用户的组,有效为真,否则为假

           文件内容是否为空:
             -s FILE:被测试的文件是否存在并且内容不为空,存在且内容不空为真,否则为假

           时间戳测试:
             -N FILE:被测试的文件自从上一次被修改之后,是否被修改过,修改过为真,否则为假

           双目测试:
             FILE1 -ef FILE2:测试两个文件是否指向同一个文件系统的相同inode的硬链接
             FILE1 -ef FILE2:被测试的两个文件,FILE1是否比FILE2更新,更新为真,否则为假
             FILE1 -ef FILE2:被测试的两个文件,FILE1是否比FILE2更旧,更旧为真,否则为假

    测试语句中可以田间逻辑运算:
      第一种表达方式:
        [ -O /tmp/test ] && [ -s /tmp/test ]
        [ -O /tmp/test ] || [ -s /tmp/test ]

      第二种表达方式:
        [ -O /tmp/test -a -s /tmp/test ]
        [ -O /tmp/test -o -s /tmp/test ]
        [!-O /tmp/test ]

    命令的执行结果:
      正常的输出结果:

      命令的执行状态返回值:
          0-255
          0:表示命令执行成功
          1,2,127:系统保留
          3-126,128-255:用户自定义的执行状态返回值   

      exit[#]退出当前shell的登录
        当shell脚本运行时,一旦遇到exit命令,将立即结束当前shell进程,同时脚本的运行也将被停止,即exit后面的所有命令都不再被解释执行;


正则表达式