10.1 通配符
通配符是由shell处理的, 它只会出现在 命令的“参数”里。当shell在“参数”中遇到了通配符
时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进
行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处
理。总之,通配符 实际上就是一种shell实现的路径扩展功能。在 通配符被处理后, shell会先
完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。
10.1.1 SHELL中的通配符
10.1.2 通配符实例
1、显示所有menu0开头的文件
[root@kittod ~]# ls menu0*
menu01.sh menu02.sh menu03.sh menu04.sh
2、显示所有m开头后面只有单个字符的文件
[root@kittod ~]# ls m?
m1 m2 m3
3、显示所有m或者n开头的文件
[root@kittod ~]# ls [mn]*
m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh n71 n72 n73
4、显示所有以字母开头的文件
[root@kittod ~]# ls [A-z]*
BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh
n71 n72 n73
5、显示所有数字开头的文件
[root@kittod ~]# ls [0-9]*
12a 12b 12c 12d
6、查看所有不区分大小写的字母开头的文件
[root@kittod ~]# ls [[:alpha:]]*
BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh
n71 n72 n73
7、查看所有以数字开头的文件
[root@kittod ~]# ls [[:digit:]]*
12a 12b 12c 12d
8、查看所有以字母或者数字开头的文件
[root@kittod ~]# ls [[:alnum:]]*
12a 12b 12c 12d BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh n71 n72 n73
10.2 正则表达式介绍和使用
在Linux命令行操作或者SHELL编程中总是容易混淆一些特殊字符的使用,比如元字符‘*’号,作为通配符匹配文件名时表示0个到无穷多个任意字符。而作为正则表达式匹配字符串时,表示重复0个到无穷多个的前一个字符。对于通配符和正则表达式之间容易理解的方法就是,在文本过滤命令中这些元字符是用做正则表达式,比如像awk,sed,grep等,主要是针对文件内容的。然而通配符多用在文件名上,比如查找find,ls,cp,mv等等。没有特殊说明,正则表达式就是指基础正则表达式。
10.2.1 什么是正则表达式
正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单的说,正则表达式就是用在字符串的处理上面的一项表示式。由于正则表达式语法简练,功能强大,得到了许多程序设计语言的支持,包括Java、C++、Perl以及Shell等。
10.2.2 为什么使用正则表达式
在进行程序设计的过程中,用户会不可避免地遇到处理某些文本的情况。有的时候,用户还需要查找符合某些比较复杂规则的字符串。对于这些情况,如果单纯依靠程序设计语言本身,则往往会使得用户通过复杂的代码来实现。但是,如果使用正则表达式,则会以非常简短的代码来完成。
10.2.3 如何学习正则表达式
1. 重点在于理解元字符
2. 掌握好正则表达式的语法
3. 开拓思路,寻找最佳的表达方法
10.2.4 如何使用正则表达式
当一个正则表达式完成之后,并能够保证这个表达式一定是准确的,需要不断地测试才可以确定其正确与否。在不同的环境下,用户需要不同的工具来帮助他完成测试的过程。如果是在Shell命令行中,用户可以使用grep命令来测试。
grep家族有三大成员分别为:
grep:支持使用基本正则表达式。
egrep:支持使用扩展正则表达式。
fgrep:不支持使用正则表达式,即所有的正则表达式中的元字符都将作为一般字符,仅仅拥有其字面意义,不再拥有特殊意义。
grep命令的名称来自于全局搜索正则表达式并打印文本行(Global Search Regular Expression and Print out the line)的缩写。它是一个非常古老的UNIX命令,也是一种强大的文本搜索工具。grep命令使用正则表达式来搜索文本,并且把匹配的文本行打印出来。
grep命令根据用户指定的”pattern(过滤条件)“对目标文本逐行进行匹配检查;打印出符合条件的行,即文本搜索工具。注:PATTERN即过滤条件指由文本字符及正则表达式元字符所编写的字符串。
grep命令的基本语法如下:grep [options] pattern [file…]
在上面的语法中,options表示选项,选项列表如下表。pattern表示要匹配的模式,file表示
一系列的文件名。grep命令会从一个或者多个文件中搜索满足指定模式的文本行,并且打印出
来。模式后面的所有的字符串参数都被看作是文件名。
-n :显示行号
-o :只显示匹配的内容
-q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
-l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl
'root' /etc
-A :如果匹配成功,则将匹配行及其后n行一起打印出来
-B :如果匹配成功,则将匹配行及其前n行一起打印出来
-C :如果匹配成功,则将匹配行及其前后n行一起打印出来
--color:高亮颜色显示匹配到的字符串
-c :如果匹配成功,则将匹配到的行数打印出来
-E :等于egrep,扩展
-i :忽略大小写
-v :取反,不匹配
-w:匹配单词
-r:递归搜索,不仅搜索当前目录,还要搜索其各级子目录
-s:不显示关于不存在或者无法读取文件的错误信息
10.3 基本正则表达式
基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之一,另外一种语法标准称为扩展正则表达式。
示例:
1)^word 表示搜索以word开头的内容。
[root@server ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@server ~]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
2)word$ 表示搜索以word结尾的内容。
[root@server ~]# grep bash passwd
root:x:0:0:root:/root:/bin/bash
fox:x:1000:1000::/home/fox:/bin/bash
cel:x:1001:1001::/home/cel:/bin/bash
[root@server ~]# grep bash$ passwd
root:x:0:0:root:/root:/bin/bash
fox:x:1000:1000::/home/fox:/bin/bash
cel:x:1001:1001::/home/cel:/bin/bash
3)^$ 表示空行,不是空格。
[root@server ~]# grep ^$ passwd [root@server ~]# grep ^$ passwd -n
18:
19:
20:
25:
29:
4). 代表且只能代表一个任意字符。
[root@server ~]# grep r.t passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@server ~]# grep r..t passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@server ~]# grep r...t passwd
unbound:x:997:996:Unbound DNS resolver:/etc/unbound:/sbin/nologin
5)* 重复0个或多个前面的字符
[root@server ~]# grep r*t passwd
6)[] 匹配字符集合内任意一个字符,如[a-z]
[root@server ~]# grep r[a-z]t passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@server ~]# grep r[a-z]*t passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
systemd-timesync:x:988:988:systemd Time Synchronization:/:/usr/sbin/nologi
7. [^abc]在中括号里表示非,不包含a或b或c
[root@server ~]# grep r[^a-z]*t passwd
rt
r.t
r..t
8){n,m} 匹配n到m次,前一个字符。
{n,} 至少N次,多了不限。
{n} n次
{,m} 至多m次,少了不限。
注意:grep要将{}转义,{},egrep不需要转义
[root@kittod ~]# grep 'r[^a-z]\{3,\}' passwd
[root@kittod ~]# grep -E 'r[^a-z]{3,}' passwd
10.4 扩展正则表达式
扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。前面介绍的元字符“^”、“$”、“.”、“*”、“[]”以及“[^]”这6个元字符在扩展正则表达式都得到了支持,并且其意义和用法都完全相同,不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。
10.5 正则表达式案例
1、显示/etc/passwd文件中以bash结尾的行;
[root@server ~]# grep bash$ /etc/passwd
2、找出/etc/passwd文件中的三位或四位数;
[root@server ~]# grep '[[:digit:]]\{3,4\}' /etc/passwd
[root@server ~]# grep -E '[[:digit:]]{3,4}' /etc/passwd
3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行;
[root@server ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4、找出"netstat -tan”命令的结果中,以‘LISTEN’后跟0个或多个空白字符结尾的行;
[root@server ~]# netstat -tan | grep "LISTEN[[:space:]]*$"
5、找出"fdisk -l“命令的结果中,取出硬盘路径;
[root@server ~]# fdisk -l | grep Disk | grep /dev/nv | cut -d: -f 1 | cut -d " " -f2
6、找出”ldd /usr/bin/cat“命令的结果中文件路径;
[root@server ~]# ldd /usr/bin/cat | egrep [[:blank:]]\+/[[:graph:]]*
7、找出/proc/meminfo文件中,所有以大写或小写s开头的行
[root@server ~]# grep -i ^S /proc/meminfo
8、显示当前系统上root、centos或spark用户的相关信息;
[root@server ~]# grep -E ^"(root|centos|spark)" /etc/passwd
[root@server ~]# egrep ^"(root|centos|spark)" /etc/passwd
9、echo输出一个绝对路径,使用egrep取出其基名;
[root@server ~]# echo /mnt/sdc/ | grep -E -o "[^/]+/?$" | cut -d "/" -f 1
10、找出ifconfig命令结果中的1-255之间的整数;
[root@server ~]# ifconfig | egrep -w "[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]"
11. 找出ifconfig命令输出中的所有IP地址
[root@server ~]# ifconfig | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
10.6 正则表达式练习
1、显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行;
[root@server ~]# grep -i ^h /etc/rc.d/rc.sysinit
2、显示/etc/passwd中以sh结尾的行;
[root@server ~]# grep sh$ /etc/passwd
3、显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
[root@server ~]# grep -E ^#[[:space:]]+[^[:space:]]* /etc/fstab
或者
[root@server ~]# grep -E ^#[[:space:]]\{1,\}[^[:space:]]* /etc/fstab
4、查找/etc/rc.d/rc.local中包含“以to开始并以to结尾”的字串行;
[root@server ~]# grep -E to[A-z]*to /etc/inittab