Linux运维学习历程-第七天-Linux文本工具及正则表达式

文本处理工具:

Linux文本处理三剑客:

  grep、egrep、fgrep:文本过滤工具(模式:pattern)工具

     grep:基本正则表达式 -E -F

     egrep:扩展正则表达式 -G -F

     fgrep:不支持正则表达式 -E -G 仅仅进行字符匹配,没有模式只有文本,推荐使用速度快

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

  gawk(awk):Linux上的实现为gawk,文本报告生成器(格式化文本)

  正则表达式:Regual Expression,REGEXP

      有一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能

    分两类:

       基本正则表达式:BRE

       扩展正则表达式:ERE

       元字符:不能够被切割,表示控制和通配的功能

grep:Global search REgular expression and Print out the line.

  作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;

  模式:由正则表达式的元字符及文本字符所编写出的过滤条件;

  正则表达式引擎

  

grep:

  grep [OPTIONS] PATTERN [FILE…]

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

      OPTIONS:

        –color=auto:对匹配到的文本着色后高亮显示

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

        -o:仅显示匹配到的字符串本身

        -v:–invert-match:显示不能被模式匹配到的行

        -E:支持使用扩展的正则表达式元字符

        -q,–quiet,–silent:静默模式,既不输出任何信息(匹配到就匹配返回值0,没匹配到就不匹配返回值1)

        -A#:after,后#行

        -B#:before,前#行

        -C#:context,前后各#行

  基本正则表达式元字符:

      字符匹配:

        .:匹配任意单个字符

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

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

        以上[]当中的范围有以下几种表示方法:

        [:digit:]:表示所有数字

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

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

        [:alpha:]:表示所有大小写字母

        [:alnum:]:表示所有字母和数字

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

        [:space:]:表示所有的空白字符

        [:graph:]:匹配打印字符。[[:graph:]] 等效于 [[:alnum:][:punct:]]。

        [:cntrl:]:匹配顺序值小于32或字符值为127的ASCII字符(控制字符)。控制字符包括换行符、换页符、退格符,等等。

        [:xdigit:]:匹配字符类[0-9A-Fa-f]中的字符

        [:print:]:匹配打印字符和空格。[[:print:]]等效于[[:graph:][:space:]]

        匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;

        *:匹配前面的字符任意次

        .*:匹配任意长度的任意字符

        \?:匹配其前面的字符0或1次,即前面的可有可无;   

        \+:匹配其前面的字符至少1次

       \{m\}:匹配其前面的字符m次

       \{m,n\}:匹配其前面的字符至少m次,至多n次

       \{0,n\}:匹配前面的字符至多n次 

       \{m,\}:匹配前面的字符至少m次

       

       位置锚定:

          ^:行首锚定:用于模式的最左侧;

          $:行尾锚定:用于模式的最右侧;

          ^PATTERN$:用于PATTERN来匹配整行

              ^$:空行;不包括空白字符的行

              ^[[:space:]]*$:空白行或包含空白字符的行

          单词:非特殊字符组成的连续字符(字符串)都称为单词

          \<或\b:词首锚定,用于单词模式的左侧

          \>或\b:词尾锚定,用于单词模式的右侧

          \<PATTERN\>:匹配完整单词;

      练习:

          1、显示/etc/passwd文件中不以/bin/bash结尾的行;

          group -v "/bin/bash$" /etc/passwd

          2、找出/etc/passwd文件中两位或三位数;

          group "\<[0-9]\{2,3\}\>" /etc/passwd

          3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行

          group "^[[:space:]]\+[^[space]]" /etc/grub2.cfg

          4、找出"netstat-tan"命令的结果中以'LISTEN'后面跟0、1或多个空白字符结尾的行

          netstat -tan |grep "LISTEN[[:space:]]*$"

       

       分组及引用:

           \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理

          Note:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:

              \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;

              \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;

              \3:模式从左侧起,第三个左括号以及与之匹配的右括号之间的模式所匹配到的字符;

              …

        后向引用:引用前面的分组括号中的模式所匹配到的字符,而非模式本身

        egrep:支持扩展的正则表达式实现类似于grep文本过滤功能;grep -E

               egrep [OPTIONS] PATTERN [FILE…]

               egrep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]        

               选项:

                  OPTIONS:

                  –color=auto:对匹配到的文本着色后高亮显示

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

                  -o:仅显示匹配到的字符串本身

                  -v:–invert-match:显示不能被模式匹配到的行

                  -E:支持使用扩展的正则表达式元字符

                  -q,–quiet,–silent:静默模式,既不输出任何信息(匹配到就匹配返回值0,没匹配到就不匹配返回值1)

                  -A#:after,后#行

                  -B#:before,前#行

                  -C#:context,前后各#行

      扩展正则表达式元字符:

      字符匹配:

        .:匹配任意单个字符

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

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

        以上[]当中的范围有以下几种表示方法:

        [:digit:]:表示所有数字

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

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

        [:alpha:]:表示所有大小写字母

        [:alnum:]:表示所有字母和数字

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

        [:space:]:表示所有的空白字符

        [:graph:]:匹配打印字符。[[:graph:]] 等效于 [[:alnum:][:punct:]]。

        [:cntrl:]:匹配顺序值小于32或字符值为127的ASCII字符(控制字符)。控制字符包括换行符、换页符、退格符,等等。

        [:xdigit:]:匹配字符类[0-9A-Fa-f]中的字符

        [:print:]:匹配打印字符和空格。[[:print:]]等效于[[:graph:][:space:]]

        匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;

        *:匹配前面的字符任意次

        ?:匹配其前面的字符0或1次,即前面的可有可无;   

        +:匹配其前面的字符至少1次

       {m}:匹配其前面的字符m次

       {m,n}:匹配其前面的字符至少m次,至多n次

       {0,n}:匹配前面的字符至多n次 

       {m,}:匹配前面的字符至少m次

       

          分组及引用:

           ():将一个或多个字符捆绑在一起,当作一个整体进行处理

          Note:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:

              \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;

              \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;

              \3:模式从左侧起,第三个左括号以及与之匹配的右括号之间的模式所匹配到的字符;

              …

        后向引用:引用前面的分组括号中的模式所匹配到的字符,而非模式本身

        或

          a|b:a或者b;

             C|cat:C或cat

             (C|c)at:Cat或cat

    练习:

       1、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少有三种实现方式;

          grep -i "^s" /proc/memsinfo

          grep "^[Ss]"  /proc/memsinfo

          egrep "^(S|s)" /proc/memsinfo

      

       2、显示当前系统上root、centos或user1用户的相关信息;

          egrep "^(root|centos|user1)\>" /etc/passwd

      

       3、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行

       egrep -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions

       

       4、使用echo命令输出一个绝对路径,使用egrep取出基名;

       echo "/tmp/dir"|egrep -o "[^/]+/?$"

       echo "/tmp/dir"|grep -o "[^/]\+\/\?$"

       进一步:取出其路径;类似于对其执行dirname命令的结果

       5、找出ifconfig命令结果中的1-255之间的数值;

         ifconfig|egrep -o "\<[1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]\>"

       

       6、添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行

       egrep "^(bash|testbash|basher|nologin):.*\1$" /etc/passwd

       egrep "^(bash|testbash|basher|nologin)\b.*\1$" /etc/passwd

       egrep "^([^:]+\>).*\1$" /etc/passwd

       fgrep:不支持正则表达式元字符

             当无需要用到元字符去编写模式时,使用fgrep必能更好;

文本查看及处理工具:wc、cut、sort、uniq、diff、patch

    wc:word count显示每个文件的换行符、 字和字节计数

       wc [OPTION]… [FILE]…

       wc [OPTION]… –files0-from=F

   显示数据含义:

       行数 单词数  字节数

            -l:仅lines行数

            -w:仅works单词数

            -c:仅bytes字节数

    

    cut:从文件的每一行中删除节

       cut OPTION… [FILE]…

                       -dCHAR:以指定的字符为分隔符,默认为空白字符例如-d:、-d|

                       -fFIELDS:挑选出的字符

                           #:显示第#行

                           #-#:显示#到#行

                           #,#:显示#和#行

    

    sort:按行排序

        sort [OPTION]… [FILE]…

        sort [OPTION]… –files0-from=F

               -n:基于数值大小而非字符进行排序

               -t CHAR:指定分隔符

               -k#:用于排序比较的字段

               -r:逆序排序

               -f:忽略字符大小写

               -u:重复的行只保留一份(重复:连续且相同)

   

    uniq:报告或忽略重复的行

          uniq [OPTION]… [INPUT [OUTPUT]]

                 -c:统计每行重复的次数

                 -u:仅显示未重复的行

                 -d:仅显示重复过的行

    diff:逐行比较文件(生成补丁)

         diff [OPTION]… FILES

                -u:使用unfied机制,即显示要修改的行的上下文,默认为3行

          diff /PATH/TO/OLDFILE /PATH/TONEWFILE >/PATH/TO/PATCH_FILE

          例如 :diff file file.new > file.patch

   

    patch:补丁更改应用的文件(向文件打补丁)

          patch [-blNR][ -c| -e| -n][-d dir][-D define][-i patchfile][-o outfile][-p num][-r rejectfile][file]

          patch [OPTIAONS] -i  /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE

          patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE

          安装patch:yum install patch

           -i:打补丁

          patch -i file.patch file

           -R:还原补丁

          patch -R -i file.patch file

原创文章,作者:NameLess,如若转载,请注明出处:http://www.178linux.com/31834