Shell編程之通配符

   Bash Shell自己不支持正則表達式,使用正則表達式的是Shell命令和工具,如grep、sed、awk正則表達式

等。可是,Bash Shell可使用正則表達式中的一些元字符實現通配(Globbing)功能。bash

   通配是把一個包含通配符的非具體文件名擴展存儲在計算機、服務器或者網絡上的一批具體文件服務器

名的過程。最經常使用的通配符包括正則表達式元字符:?、*、[]、{}、^等。這些元字符在通配中的意義網絡

與正則表達式中的意義不徹底一致,*符號再也不表示其前面字符的重複,而是表示任意位的任意字ide

符,?字符表示一個任意字符,^符號在通配中不表明行首,而是表明取反。
工具


例如,若是一個用戶不知道在一個擴展名爲.conf的文件名中前綴是如何拼寫的,是 prelink還spa

是prilink。這時用戶能夠輸入:
server

 
 
pr*link.conf


下面舉幾個例子來講明通配的使用和通配元字符的意義,這些例子都用ls命令進行通配,ls 命令是Linux 下最經常使用的命令之一,它用於列出目錄下的文件,它能夠有不少選項,ls -l表示列出文件的詳細信息,ll命令等價於ls -l命令。/usr/local/zabbix/etc 目錄下的全部文件以下所示:ip

 
 
[root@zabbix etc]# pwd
/usr/local/zabbix/etc
[root@zabbix etc]# ll
總計 36
-rw-r--r-- 1 root root  1601 11-06 12:18 zabbix_agent.conf
drwxr-xr-x 2 root root  4096 11-06 12:18 zabbix_agent.conf.d
-rw-r--r-- 1 root root  7191 11-14 11:46 zabbix_agentd.conf
drwxr-xr-x 2 root root  4096 11-06 12:18 zabbix_agentd.conf.d
-rw-r--r-- 1 root root 10534 11-06 18:19 zabbix_server.conf
drwxr-xr-x 2 root root  4096 11-06 12:18 zabbix_server.conf.d


/usr/local/zabbix/etc 目錄下包含三個子目錄,子目錄的詳細信息以d 開頭,d 表示directory的意思,其餘以橫槓(-)開頭的都是文件。it

若是咱們僅須要列出/usr/local/zabbix/etc 目錄下以.conf 結尾的文件,就可使用*.conf 匹配全部以.conf結尾的文件,以下所示:

 
 
#列出以.conf結尾的文件的詳細信息
[root@zabbix etc]# ll *.conf
-rw-r--r-- 1 root root  1601 11-06 12:18 zabbix_agent.conf
-rw-r--r-- 1 root root  7191 11-14 11:46 zabbix_agentd.conf
-rw-r--r-- 1 root root 10534 11-06 18:19 zabbix_server.conf


若是咱們需列出以zabbix_s開頭、後面跟5 個字符且以.conf 爲後綴的文件,可使用zabbix_s?????.conf來匹配這些文件,以下面所示。

 
 
#列出以zabbix_s開頭後跟5個字母,以conf結尾的文件
[root@zabbix etc]# ls -l zabbix_s?????.conf
-rw-r--r-- 1 root root 10534 11-06 18:19 zabbix_server.conf




下面舉一個用[]符號進行通配的例子,若咱們需列出在l~n範圍內以字母開頭並以.conf結尾的文件,咱們能夠用[l-n]*.conf來匹配這些文件,以下面所示。


目錄/etc 下有248個文件及目錄:

 
 
[root@zabbix etc]# pwd
/etc
[root@zabbix etc]# ll | wc -l
248


列出以l~n範圍內字母開頭,且以.conf結尾的文件的詳細信息

[root@zabbix etc]# ll [l-n]*.conf
-rw-r--r-- 1 root root  9111 10-30 15:58 ldap.conf
-rw-r--r-- 1 root root   124 11-06 15:31 ld.so.conf
-rw-r--r-- 1 root root  3544 2013-01-09 lftp.conf
-rw-r----- 1 root root   191 2011-10-27 libaudit.conf
-rw-r--r-- 1 root root  2506 10-30 15:58 libuser.conf
-rw-r--r-- 1 root root   619 2012-06-04 logrotate.conf
-rw-r--r-- 1 root root 10814 2006-02-21 ltrace.conf
-rwxr-xr-x 1 root root  2242 2011-05-19 mcelog.conf
-rw-r--r-- 1 root root   330 2013-05-09 mke2fs.conf
-rw-r--r-- 1 root root   315 10-30 15:59 modprobe.conf
-rw-r--r-- 1 root root  1983 2007-01-07 mtools.conf
-rw-r--r-- 1 root root  2706 10-02 06:18 multipath.conf
-rw-r--r-- 1 root root  1895 10-01 18:22 nscd.conf
-rw-r--r-- 1 root root  1717 10-30 15:39 nsswitch.conf
-rw-r--r-- 1 root root  1839 2011-11-18 ntp.conf


可見結果確實僅列出以l~n 範圍內字母開頭且以.conf 結尾的文件。

若是咱們要列出以l~n範圍內字母開頭且句點後不是以.conf結尾的文件,可使用[l-n]*.[^conf]*來匹配這些文件,句點後面方括號內使用"^"符號表示取反,即除去c、o、n和f這四個字母,並且最後一個*符號必不可少,不然句點後僅匹配一個字符,下面命令給出了[l-n]*.[^conf]*的匹配結果。


列出以l~n範圍內字母開頭,不以.conf結尾的文件


[root@zabbix etc]# ll [l-n]*.[^conf]*
-rw-r--r-- 1 root root 105305 11-06 16:19 ld.so.cache
-rw-r--r-- 1 root root    124 11-06 15:31 ld.so.conf
-rw-r--r-- 1 root root   1522 10-30 15:58 login.defs
-rw-r--r-- 1 root root    112 2007-01-07 mail.rc
-rw-r--r-- 1 root root  14100 2007-01-07 mime.types
-rw-r--r-- 1 root root   1112 2007-01-07 minicom.users
-rw-r--r-- 1 root root      0 2012-08-06 Muttrc.local
-rw-r--r-- 1 root root    441 2013-01-23 my.cnf.rpmnew
 
 


由上可知,[]符號的意義與正則表達式中[]符號的意義同樣,那麼通配中的花括號"{}"表示何種意義呢?正則表達式中只有在花括號前加上轉義符的用法,即\{\},用於限制匹配字符的個數。可是,通配中的{}符號表示一組表達式的集合,如:

 
 
{[l-n]*.conf ,y?.conf}


上述通配表示知足[l-n]*.conf或y?.conf的全部文件,下面給出了這一通配的執行結果。

 
 

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

[root@zabbix etc]# ll {[l-n]*.conf,y?.conf}
-rw-r--r-- 1 root root  9111 10-30 15:58 ldap.conf
-rw-r--r-- 1 root root   124 11-06 15:31 ld.so.conf
-rw-r--r-- 1 root root  3544 2013-01-09 lftp.conf
-rw-r----- 1 root root   191 2011-10-27 libaudit.conf
-rw-r--r-- 1 root root  2506 10-30 15:58 libuser.conf
-rw-r--r-- 1 root root   619 2012-06-04 logrotate.conf
-rw-r--r-- 1 root root 10814 2006-02-21 ltrace.conf
-rwxr-xr-x 1 root root  2242 2011-05-19 mcelog.conf
-rw-r--r-- 1 root root   330 2013-05-09 mke2fs.conf
-rw-r--r-- 1 root root   315 10-30 15:59 modprobe.conf
-rw-r--r-- 1 root root  1983 2007-01-07 mtools.conf
-rw-r--r-- 1 root root  2706 10-02 06:18 multipath.conf
-rw-r--r-- 1 root root  1895 10-01 18:22 nscd.conf
-rw-r--r-- 1 root root  1717 10-30 15:39 nsswitch.conf
-rw-r--r-- 1 root root  1839 2011-11-18 ntp.conf
-rw-r--r-- 1 root root   585 2011-06-30 yp.conf


注意: {}符號內的表達式是"或"的關係,即只要符合{}符號內的一個表達式的文件,就能被列出。

相關文章
相關標籤/搜索