Bash Shell本身不支援正規表達式,使用正規表達式的是Shell指令和工具,如grep、sed、awk
等。但是,Bash Shell可以使用正規表達式中的一些元字元實作通配(Globbing)功能。
通配是把一個包含通配符的非具體檔案名擴充存儲在計算機、伺服器或者網絡上的一批具體檔案
名的過程。最常用的通配符包括正規表達式元字元:?、*、[]、{}、^等。這些元字元在通配中的意義
與正規表達式中的意義不完全一緻,*符号不再表示其前面字元的重複,而是表示任意位的任意字
符,?字元表示一個任意字元,^符号在通配中不代表行首,而是代表取反。
例如,如果一個使用者不知道在一個擴充名為.conf的檔案名中字首是如何拼寫的,是 prelink還
是prilink。這時使用者可以輸入:
1
<code>pr</code><code>*link.conf</code>
下面舉幾個例子來說明通配的使用和通配元字元的意義,這些例子都用ls指令進行通配,ls 指令是Linux 下最常用的指令之一,它用于列出目錄下的檔案,它可以有很多選項,ls -l表示列出檔案的詳細資訊,ll指令等價于ls -l指令。/usr/local/zabbix/etc 目錄下的所有檔案如下所示:
2
3
4
5
6
7
8
9
10
<code>[root@zabbix etc]</code><code># pwd</code>
<code>/usr/local/zabbix/etc</code>
<code>[root@zabbix etc]</code><code># ll</code>
<code>總計 36</code>
<code>-rw-r--r-- 1 root root 1601 11-06 12:18 zabbix_agent.conf</code>
<code>drwxr-xr-x 2 root root 4096 11-06 12:18 zabbix_agent.conf.d</code>
<code>-rw-r--r-- 1 root root 7191 11-14 11:46 zabbix_agentd.conf</code>
<code>drwxr-xr-x 2 root root 4096 11-06 12:18 zabbix_agentd.conf.d</code>
<code>-rw-r--r-- 1 root root 10534 11-06 18:19 zabbix_server.conf</code>
<code>drwxr-xr-x 2 root root 4096 11-06 12:18 zabbix_server.conf.d</code>
/usr/local/zabbix/etc 目錄下包含三個子目錄,子目錄的詳細資訊以d 開頭,d 表示directory的意思,其他以橫杠(-)開頭的都是檔案。
如果我們僅需要列出/usr/local/zabbix/etc 目錄下以.conf 結尾的檔案,就可以使用*.conf 比對所有以.conf結尾的檔案,如下所示:
<code>#列出以.conf結尾的檔案的詳細資訊</code>
<code>[root@zabbix etc]</code><code># ll *.conf</code>
如果我們需列出以zabbix_s開頭、後面跟5 個字元且以.conf 為字尾的檔案,可以使用zabbix_s?????.conf來比對這些檔案,如下面所示。
<code>#列出以zabbix_s開頭後跟5個字母,以conf結尾的檔案</code>
<code>[root@zabbix etc]</code><code># ls -l zabbix_s?????.conf</code>
下面舉一個用[]符号進行通配的例子,若我們需列出在l~n範圍内以字母開頭并以.conf結尾的檔案,我們可以用[l-n]*.conf來比對這些檔案,如下面所示。
目錄/etc 下有248個檔案及目錄:
<code>/etc</code>
<code>[root@zabbix etc]</code><code># ll | wc -l</code>
<code>248</code>
列出以l~n範圍内字母開頭,且以.conf結尾的檔案的詳細資訊
11
12
13
14
15
16
<code>[root@zabbix etc]</code><code># ll [l-n]*.conf</code>
<code>-rw-r--r-- 1 root root 9111 10-30 15:58 ldap.conf</code>
<code>-rw-r--r-- 1 root root 124 11-06 15:31 ld.so.conf</code>
<code>-rw-r--r-- 1 root root 3544 2013-01-09 lftp.conf</code>
<code>-rw-r----- 1 root root 191 2011-10-27 libaudit.conf</code>
<code>-rw-r--r-- 1 root root 2506 10-30 15:58 libuser.conf</code>
<code>-rw-r--r-- 1 root root 619 2012-06-04 logrotate.conf</code>
<code>-rw-r--r-- 1 root root 10814 2006-02-21 ltrace.conf</code>
<code>-rwxr-xr-x 1 root root 2242 2011-05-19 mcelog.conf</code>
<code>-rw-r--r-- 1 root root 330 2013-05-09 mke2fs.conf</code>
<code>-rw-r--r-- 1 root root 315 10-30 15:59 modprobe.conf</code>
<code>-rw-r--r-- 1 root root 1983 2007-01-07 </code><code>mtools</code><code>.conf</code>
<code>-rw-r--r-- 1 root root 2706 10-02 06:18 multipath.conf</code>
<code>-rw-r--r-- 1 root root 1895 10-01 18:22 nscd.conf</code>
<code>-rw-r--r-- 1 root root 1717 10-30 15:39 nsswitch.conf</code>
<code>-rw-r--r-- 1 root root 1839 2011-11-18 ntp.conf</code>
可見結果确實僅列出以l~n 範圍内字母開頭且以.conf 結尾的檔案。
如果我們要列出以l~n範圍内字母開頭且句點後不是以.conf結尾的檔案,可以使用[l-n]*.[^conf]*來比對這些檔案,句點後面方括号内使用"^"符号表示取反,即除去c、o、n和f這四個字母,而且最後一個*符号必不可少,否則句點後僅比對一個字元,下面指令給出了[l-n]*.[^conf]*的比對結果。
列出以l~n範圍内字母開頭,不以.conf結尾的檔案
<code>[root@zabbix etc]</code><code># ll [l-n]*.[^conf]*</code>
<code>-rw-r--r-- 1 root root 105305 11-06 16:19 ld.so.cache</code>
<code>-rw-r--r-- 1 root root 124 11-06 15:31 ld.so.conf</code>
<code>-rw-r--r-- 1 root root 1522 10-30 15:58 login.defs</code>
<code>-rw-r--r-- 1 root root 112 2007-01-07 mail.rc</code>
<code>-rw-r--r-- 1 root root 14100 2007-01-07 mime.types</code>
<code>-rw-r--r-- 1 root root 1112 2007-01-07 minicom.</code><code>users</code>
<code>-rw-r--r-- 1 root root 0 2012-08-06 Muttrc.</code><code>local</code>
<code>-rw-r--r-- 1 root root 441 2013-01-23 my.cnf.rpmnew</code>
由上可知,[]符号的意義與正規表達式中[]符号的意義一樣,那麼通配中的花括号"{}"表示何種意義呢?正規表達式中隻有在花括号前加上轉義符的用法,即\{\},用于限制比對字元的個數。但是,通配中的{}符号表示一組表達式的集合,如:
<code>{[l-n]*.conf ,y?.conf}</code>
上述通配表示滿足[l-n]*.conf或y?.conf的所有檔案,下面給出了這一通配的執行結果。
列出比對[l-n]*.conf 或 y?.conf的所有檔案
17
<code>[root@zabbix etc]</code><code># ll {[l-n]*.conf,y?.conf}</code>
<code>-rw-r--r-- 1 root root 585 2011-06-30 yp.conf</code>
注意: {}符号内的表達式是"或"的關系,即隻要符合{}符号内的一個表達式的檔案,就能被列出。
本文轉自marbury 51CTO部落格,原文連結:http://blog.51cto.com/magic3/1353068,如需轉載請自行聯系原作者