天天看點

Shell程式設計之通配符

   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,如需轉載請自行聯系原作者