通配符
当需要用命令查询所需要的结果时,用户不必全部查出一个一个找,可以使用Shell通配符。Shell命令的通配符含义如下表
符号 | 含义 | 实例 | |
* | 任意长度的任意字符 | a*b,匹配如a3b、acb、aabc、a/b、a123,/b。 | |
? | 匹配任意单字符 | a?b,匹配如a1b、acb、a,b | |
[ ] | 匹配指定范围内的任意字符 | a[xyz]b,匹配如axb、ayb、azb | |
[ - ] | 匹配任意一个字符范围 | a[a-z]b,匹配如ayb、acb、adb、aub | |
[^...] | 除了指定的字符,均可匹配 |
a[^0-9]b,除了a0b-a9b,其它都匹配 |
特殊字符集合
为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是A-Za-z0-9的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在Linux下的grep除fgrep外,都支持POSIX的字符类。
[:space:] : 所有空白字符
[:punct:] : 所有标点符号
[:lower:] :所有小写字母
[:upper:] :所有大写字母
[:digit:] :所有数字
[:alnum:] :所有数字和字母
[:alpha:] :所有字母
[:print:] :所有非空白字符(包括空格)
例子:
1、显示/tmp/ky目录下所有以字母开头的文件或目录
2、显示/tmp/ky目录下以字母开头,以一个小写字母结尾,中间出现一位数字的文件或目录
注意:命令行中间加*的意义就是,*表示任意长度的任意字符,也可以表示0个,所以在两个字符之间不知道是什么的情况下都要加*
3、显示/tmp/ky目录下以字母开头,以一个小写字母结尾,中间是空格的文件或目录
4、显示/tmp/ky目录下以字母结尾,中间是符号的文件或目录
5、显示/var目录下所有以l开头,以一个小字母结尾,且中间出现一位数字的文件或目录;
# ls /var/l*[[:digit:]]*[[:lower:]]
这个文件或目录并不存在,事先可以先创建,在进行检测
注意这里的[[:digit:]]为什么是双中括号呢,因为,[:digit:]就是表示一个集合,而表示范围内的字符,必须加中括号。所以就是[[:digit:]],固定格式
6、显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录;
# ls -d /etc/[[:digit:]]*[^[:digit:]]
这个文件或目录并不存在,事先可以先创建,在进行检测
7、显示/etc目录下,以非字母开头,后面跟了一个字母及其它任意长度字符的文件或目录;
# ls -d /etc/[^[:alpha:]][[:alpha:]]*
这个文件或目录并不存在,事先可以先创建,在进行检测
8、复制/etc目录下,所有以p开头,以非数字结尾的文件或目录至/tmp/mytest1目录;
# mkdir /tmp/mytest1
# cp -r /etc/p*[^[:digit:]] /tmp/mytest1
9、复制/etc/目录下,所有以.d结尾的文件或目录至/tmp/mytest2目录;
# mkdir /tmp/mytest2
# cp -r /etc/*.d /tmp/mytest2
10、复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录;
# mkdir /tmp/mytest3
# cp -r /etc/[lmn]*.conf /tmp/mytest3
菜鸟的成长记录--linux 通配符和特殊字符集合的使用