21.egrep进阶及文本处理工具应用

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

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

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

fgrep:不支持正则表达式

egrep:

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

grep[OPTIONS]PATTERN[FILE...]

  选项:

    -i,-o,-v,-q,-A,-B,-C

    -G:支持基本正则表达式

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

    字符匹配:

      .:任意单个字符

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

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

    次数匹配:

      *:任意次,0,1或多次;

      ?:0次或1次,其前的字符是可有可无的;

      +:其前字符至少一次;

      {m}:其前的字符m次;

      {m,n}:至少m次,至多n次;

        {0,n}

        {m,}

    位置锚定

      ^:行首锚定;

      $:行尾锚定;

      \<,\b:词首锚定;

      \>,\b:词尾锚定;

    分组及引用:

      ():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;

      后向引用:\1,\2,...

    或:

      a|b:a或者b;

        C|cat:C或cat

        (c|C)at:cat或Cat

    

  练习:

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

       grep -i “^[sS]” /proc/meminfo

       grep -i "^s" /proc/meminfo

       grep “^[sS]” /proc/meminfo

       grep -E "^(s|S)" /procmeminfo

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

       grep -E “^(root|centos|user1)\>” /etc/passwd

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

       grep -E -o “[_[:alnum:]]+\(\)” /etc/rc.d.init.d/functions

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

       echo /etc/sysconfig/ | grep -E -o “[^/]+/?$”

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

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

       ifconfig | grep -E -o “\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>”

    6.课外作业:找出ifconfig命令结果中的ip地址;

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

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

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

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

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

    wc:word count

      wc [option]... [FILE]...

        -l:lines

        -w:words

        -c:bytes

    cut:

      cut OPTION...[FILE]...

        OPTION:

          -d CHAR:以指定的字符为分隔符;

          -f FIELDS:挑选出的字段;

            #:指定的单个字段;

            #-#:连续的多个字段;

            #,#:离散的多个字段;

    sort:

      sort [option]...[file]...

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

        -t CHAR:指定分隔符;

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

        -r:逆序排序;

        -f:忽略字符大小写

        -u:重复的行只保留一份;

          重复行:连续且相同;

    uniq:报告或移除重复的行

      uniq[option]...[input [output]]

        -c:显示每行的重复次数;

        -u:仅显示未曾重复过的行;

        -d:仅显示重复过的行;

    diff:compare files line by line

      diff [option]...files

      diff /path/to/oldfile /path/to/newfile > /path/to/patch_file

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

    patch:向文件打补丁

      patch[options] -i /path/to/patch_file /path/to/oldfile

      patch /path/to/oldfile < /path/to/patch_file

    练习:取出ifconfig eno16777736命令结果中的ip地址;

相关推荐