正则表达式--对于系统管理员,每天要处理很多的信息,其中有好多无用的信息,可以通过正则表达式对信息进行过滤筛选,所谓正则表达式,就是通过一些特殊字符的排列,用以搜索,替换,删除一行或多行字符串.



目录 

  • 文本过滤工具grep

  • 正则表达式

  • 案例

  • 扩展正则表达式


一、文本过滤工具grep

格式:grep + [选项] + 匹配内容 + [文件]

   --color=auto  关键字高亮显示

   -v    显示不被匹配到的行

   -i    忽略大小写

   -n    显示匹配的行号   cat /etc/passwd |grep -n  root

   -c    显示匹配的行数

   -o    仅显示匹配的字符串

   -q    静默模式,不显示任何信息

         可以用在当我们关心的是执行是否成功,不关心执行结果的时候

         grep -q shuguo /etc/group && echo exist || echo not exist   存在则输出exist,不存在则输出not exist

   -A + 数字  显示匹配行和向下相邻指定数字的行

        cat /etc/passwd |grep -A 3  root

   -B + 数字  显示匹配行和向上相邻指定数字的行

   -C + 数字  显示匹配行和向上和向下相邻指定数字的行  

   -e         多个选项之间or关系

         grep -e root -e bin /etc/passwd

   -w         仅匹配整个单词

   -E或egrep  支持正则表达式

         grep -E "root|bin" /etc/passwd

         egrep "root|bin" /etc/passwd

   -F或fgrep  不支持正则表达式


二、正则表达式

   字符匹配

      .    匹配任意单个字符

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

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

      [:alnum:] [:alpha:] [:lower:] [:upper:] [:digit:] [:punct:]

      [:blank:]   空格和制表符

      [:space:]   水平和垂直的空白字符(比[:blank:]范围广)

   次数匹配   用在要指定次数的字符后面

       *        匹配前面的字符任意次,包括0次

             例如: .*    任意长度的任意字符

       \?       匹配前面的字符0或1次

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

       \{n\}    匹配前面的字符n次

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

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

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

   位置锚定   定位出现的位置,到哪里开始,到哪里结束

       ^        行首锚定

       $       行尾锚定

          例如:匹配以#开头,以0结尾,中间内容任意

                grep "^#.*0$" 

                匹配以#开头,以0结尾

               grep "^#0$" 

       ^$       空行

       ^[[:space:]]*$  空白行

       \<      词首锚定

       \>      词尾锚定

   分组

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

     例如:grep "[ab]\{2\}"   表示a或者b匹配两次

           grep "\(ab\)\{2\}" 表示ab这个整体匹配两次

    分组括号内匹配到的内容会记录于变量中,这些变量的命名为\1,\2...

      \(string1\+\(string2\)\)

      \1 表示 string1\+\(string2\)

      \2 表示 string2

   \|  或

      a\|b        a或b

      \(C\|c\)at  Cat或cat


三、案例

   1、显示/proc/meminfo文件中以大小s开头的行

cat /proc/meminfo |grep "^s\|^S"
cat /proc/meminfo |grep -i ^s
grep ^[sS] /proc/meminfo
grep -e ^s -e ^S /proc/meminfo

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

cat /etc/passwd |grep -v "/bin/bash$"

   3、显示用户rpc默认的shell程序


grep  "^\<rpc\>" /etc/passwd |cut -d: -f7
grep  "^rpc\>" /etc/passwd |cut -d: -f7
grep  "^\(rpc\)" /etc/passwd |cut -d: -f7

   前两个结果一样,是题目要求的结果

   注意区别

   4、找出/etc/passwd中的两位或三位数

        cat /etc/passwd |grep  -o "[[:digit:]]\{2,3\}"

        cat /etc/passwd |grep -o "[[:digit:]]\{2\}\|[[:digit:]]\{3\}"

    5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行

      cat /etc/grub2.cfg | grep "^[[:space:]]\+[^[:space:]]"

   6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行

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

   7、显示CentOS7上所有系统用户的用户名和UID

      cat /etc/passwd |cut -d: -f1,3 | grep "\<[0-9]\{1,3\}\>"

   8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名同shell名的行

         useradd bash

         useradd testbash

         useradd basher

         useradd sh

         useradd -s /sbin/nologin nologin

         cat /etc/passwd |grep "^\(.*\)\>.*\<\1$"

  9、利用df和grep,取出磁盘各分区利用率,并从大到小排序

      df |grep "^/dev/sd" |grep -o "[[:digit:]]\{1,3\}%" |tr -d % |sort -nr


四、扩展正则表达式

   egrep = grep -E

   egrep的字符匹配,次数匹配,位置锚定,分组和grep的区别就是去掉符号前边的\,除了\<,\>,\b不变

   案例:

    1、显示三个用户root、mage、wang的UID和默认shell

     cat /etc/passwd |cut -d: -f1,3,7 |grep -w "root\|mage\|wang"

     cat /etc/passwd |cut -d: -f1,3,7 |grep "^\(root\|mage\|wang\)\>"

    2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

    cat /etc/rc.d/init.d/functions |egrep "^[_[:alpha:]]+\(\)"

    3、使用egrep取出/etc/rc.d/init.d/functions中其基名

     echo /etc/rc.d/init.d/functions |egrep -o "\<[[:alpha:]]*\>$"

     echo /etc/rc.d/init.d/functions |egrep -o "\<[a-z]*\>$"

    4、使用egrep取出/etc/rc.d/init.d/functions/的目录名

     echo /etc/rc.d/init.d/functions/ |egrep -o ".*/." |egrep -o ".*/"

    5、统计last命令中以root登录的每个主机IP地址登录次数

     last |grep "root" |tr -s " " : |cut -d: -f3 |uniq -c |sort -u

    6、将此字符串:welcome to  magedu linux 中的每个字符去重并排序,重复次数多的排到前面

     echo welcome to magedu linux |grep -o . |sort |uniq -c |sort -nr