天天看点

Shell编程之通配符

   Bash Shell本身不支持正则表达式,使用正则表达式的是Shell命令和工具,如grep、sed、awk

等。但是,Bash Shell可以使用正则表达式中的一些元字符实现通配(Globbing)功能。

   通配是把一个包含通配符的非具体文件名扩展存储在计算机、服务器或者网络上的一批具体文件

名的过程。最常用的通配符包括正则表达式元字符:?、*、[]、{}、^等。这些元字符在通配中的意义

与正则表达式中的意义不完全一致,*符号不再表示其前面字符的重复,而是表示任意位的任意字

符,?字符表示一个任意字符,^符号在通配中不代表行首,而是代表取反。

例如,如果一个用户不知道在一个扩展名为.conf的文件名中前缀是如何拼写的,是 prelink还

是prilink。这时用户可以输入:

下面举几个例子来说明通配的使用和通配元字符的意义,这些例子都用ls命令进行通配,ls 命令是Linux 下最常用的命令之一,它用于列出目录下的文件,它可以有很多选项,ls -l表示列出文件的详细信息,ll命令等价于ls -l命令。/usr/local/zabbix/etc 目录下的所有文件如下所示:

/usr/local/zabbix/etc 目录下包含三个子目录,子目录的详细信息以d 开头,d 表示directory的意思,其他以横杠(-)开头的都是文件。

如果我们仅需要列出/usr/local/zabbix/etc 目录下以.conf 结尾的文件,就可以使用*.conf 匹配所有以.conf结尾的文件,如下所示:

如果我们需列出以zabbix_s开头、后面跟5 个字符且以.conf 为后缀的文件,可以使用zabbix_s?????.conf来匹配这些文件,如下面所示。

下面举一个用[]符号进行通配的例子,若我们需列出在l~n范围内以字母开头并以.conf结尾的文件,我们可以用[l-n]*.conf来匹配这些文件,如下面所示。

目录/etc 下有248个文件及目录:

列出以l~n范围内字母开头,且以.conf结尾的文件的详细信息

可见结果确实仅列出以l~n 范围内字母开头且以.conf 结尾的文件。

如果我们要列出以l~n范围内字母开头且句点后不是以.conf结尾的文件,可以使用[l-n]*.[^conf]*来匹配这些文件,句点后面方括号内使用"^"符号表示取反,即除去c、o、n和f这四个字母,而且最后一个*符号必不可少,否则句点后仅匹配一个字符,下面命令给出了[l-n]*.[^conf]*的匹配结果。

列出以l~n范围内字母开头,不以.conf结尾的文件

由上可知,[]符号的意义与正则表达式中[]符号的意义一样,那么通配中的花括号"{}"表示何种意义呢?正则表达式中只有在花括号前加上转义符的用法,即\{\},用于限制匹配字符的个数。但是,通配中的{}符号表示一组表达式的集合,如:

上述通配表示满足[l-n]*.conf或y?.conf的所有文件,下面给出了这一通配的执行结果。

列出匹配[l-n]*.conf 或 y?.conf的所有文件  

注意: {}符号内的表达式是"或"的关系,即只要符合{}符号内的一个表达式的文件,就能被列出。