正则表达式和通配符的异同

通配符

        一般和ls工具搭配,用来查找文件或者目录名。常见的一些符号有“?”“*” “【】”等等,下面分别说一下每种符号代表的大概意思:

  • [a-z]或[12]:匹配方括号中指定范围内的单个字符或方括号列出的其中一个字符。
  • [!9]:不匹配方括号中所列字符或指定范围内的单个字符。
  • *:匹配0个字符或多个字符。
  • ?:匹配任何单个字符,且不能为空字符。
练习习题:

1、显示/etc目录下所有以k开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录
2、显示/proc目录下名字由任意三位数字组成的文件或目录
3、显示/var/log目录下文件名包含符号及数字的文件或目录
4、显示/usr/share/man目录下所有以m开头,以一个数字和x结尾的文件或目录
5、显示/etc目录下,所有以一个大写字母开头,以两个数字结尾的文件或目录
6、显示/etc目录下,文件名至少包含一个小写字母和一个数字并以.conf结尾的文件或目录
7、只显示用户家目录下的非隐藏目录

练习答案:

1.ls -d /etc/k*[[:digit:]]*[[:lower]]
2.ls -d /proc/[0-9][0-9][0-9]
3.ls -d /var/log/*[[:punct:]]*[0-9]*
4.ls -d /usr/share/man/m*[0-9]x
5.ls -d /etc/[[:upper]]*[0-9][0-9]
6.ls -d /etc/*[[:lower]]*[0-9]*.conf
7.ls -d ~/*/

大概解释下第一条答案的各个字符的含义。 -d的意思是只列出目录属性,不显示其内容。/etc/是要搜索的路径。搜索/etc/路径下以k开头中间有数字,结尾是小写字母的文件或者目录。

正则表达式:

     正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。构造正则表达式的方法和创建数学表达式的方法一样。也就是说,简单的来说,正则表达式就是当我们对文本要进行搜索和替换操作时所需要的语法。

常用符号:

  • .:匹配任何单个字符,功能上和通配符中的?符号相同。
  • [a-z]或[12]:功能上和通配符中的[]相同。
  • [^]:功能和通配符中的[!]相同。
  • *:匹配该字符的前一个字符的0次或多次出现。
  • ^:匹配所有以指定正则表达式开始的行。配合中括号时这样使用,^[]代表指定以中括号内部开始的行。
  • \>和\<:表示单词的边界,比如搜索, grootd 和 :root:时 \意思就是只搜索这个单词,而不搜索包含这个单词的内容
  • $:匹配所有以指定正则表达式结束的行。

      需要注意的是:[]中的特殊字符如.已经失去了其特殊含义,和方括号中的普通字符[12]一样。

练习题:

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程序
    cat /etc/passwd |grep "^rpc\b" |cut -d: -f7
4、找出/etc/passwd中的两位或三位数
    cat /etc/passwd | grep  -o "\<[[:digit:]]\{2,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名的行
    cat /etc/passwd | egrep "^(.*)\>.*\<\1$"
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
     df | grep -o "[0-9]\{1,3\}%" | grep -o "[0-9]\+" | sort -nr
     df |grep "^/dev/sd" |grep -o "[[:digit:]]\{1,3\}%" |tr -d % |sort -nr

解释下第8题答案,^代表取行首,\>是单词右边界,^(.*)\>意思就是取这行第一个单词,并将其放在分组,后面跟着.*意思是中间有任意字符,\<\1$意思是行尾的单词跟行首的单词相同。

练习题:

1、显示三个用户root、mage、wang的UID和默认shell
    cat /etc/passwd |egrep "^(root|mage|wang)\>"|cut -d: -f3,7
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
    egrep "^[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
    echo /etc/rc.d/init.d/functions |egrep -o "[^/]+$"
4、使用egrep取出上面路径的目录名
    echo /etc/rc.d/init.d/functions | egrep -o ".*/." |egrep -o ".*/"
5、统计last命令中以root登录的每个主机IP地址登录次数
    last |grep "^root\>" |egrep -o "([[:digit:]]{1,3}.){3}[[:digit:]]{1,3}" |sort -nr |uniq -c
6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
    [0-9]
    [1-9][0-9]
    1[0-9]{2}
    2[0-4][0-9]
    25[0-5]
7、显示ifconfig命令结果中所有IPv4地址
    ifconfig | egrep "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" -o
8、将此字符串:welcome to  magedu linux 中的每个字符去重并排序,重复次数多的排到前面
    echo welcome to magedu linux | grep -o . | sort | uniq -c | sort -nr

通配符和正则表达式的一些异同:

  • 通配符中,*号代表0或者多个任意字符,而在正则表达式中,*表示重复前面出现的字符0次或者多次。
  • 通配符中反选用的是[!range],正则表达式中反选用的是[^range]

你可能感兴趣的:(linux运维)