shell通配符與正則表達式

    通配符是系統level的 而正則表達式需要相關工具的支持: egrep, awk, vi, perl。在文本過濾工具里,都是用正則表達式,比如像awk,sed等,是針對文件的內容的。通配符多用在文件名上,比如查找find,ls,cp,等等。

1.通配符      

(1)通配符語法:*      
* 將與零個或多個字符匹配。這就是說“什么都可以”。例子:      
  /etc/g* 與 /etc 中以 g 開頭的所有文件匹配。      
  /tmp/my*1 與 /tmp 中以 my 開頭,并且以 1 結尾的所有文件匹配。      
(2)通配符語法:?      
? 與任何單個字符匹配。例子:      
  myfile? 與文件名為 myfile 后跟單個字符的任何文件匹配。      
  /tmp/notes?txt 將與 /tmp/notes.txt 和 /tmp/notes_txt 都匹配,如果它們存在。      
(3)通配符語法:[]      
    該通配符與 ? 相似,但允許指定得更確切。要使用該通配符,把您想要匹配的所有字符放在 [] 內。結果的表達式將與 [] 中任一字符相匹配。您也可以用 – 來指定范圍,甚至還可以組合范圍。例子:      
    myfile[12] 將與 myfile1 和 myfile2 匹配。只要當前目錄中至少有一個這樣的文件存在,該通配符就可以進行擴展。      
    [Cc]hange[Ll]og 將與 Changelog、ChangeLog、changeLog 以及 changelog 匹配。您可以看到,與大寫形式的變形匹配時,使用括弧通配符很有用。      
    ls /etc/[0-9]* 將列出 /etc 中以數字開頭的所有文件。      
    ls /tmp/[A-Za-z]* 將列出 /tmp 中以大寫字母或小寫字母開頭的所有文件。

(4)通配符語法:[!]       
    除了不與括弧中的任何字符匹配外,[!] 構造與 [] 構造類似,只要不是列在 [! 和 ] 之間的字符,它將與任何字符匹配。例子:        
     rm myfile[!9] 將刪除除 myfile9 之外的名為 myfile 加一個字符的所有文件。        
    通配符告誡說明        
    這里有一些使用通配符時應該注意的告誡說明。由于 bash 對與通配符相關的字符(?、[、]、*)進行特別處理,因此您將包含這些字符的參數輸入到命令中時,需要特別小心。例如,如果您想要創建一個包含字符串 [fo]* 的文件,下面這個命令可能不會執行您想要做的事:        
    $ echo [fo]* > /tmp/mynewfile.txt        
    如果 [fo]* 這個模式與當前工作目錄中的任何文件匹配,那么您將在 /tmp/mynewfile.txt 內發現那些文件的名稱,而不是您所期望的文字 [fo]*。解決方法是什么呢?嗯,一種方法是用單引號把這些字符括起來,這將告訴 bash 單純地執行,而不會對其進行通配符擴展:        
    $ echo '[fo]*' > /tmp/mynewfile.txt        
采用這種方法,您的新文件將包含所期望的文字的 [fo]*。另一種方法是,您可以使用反斜杠,告訴 bash [、] 和 * 應該被當成文字處理,而不是被當成通配符處理:        
    $ echo \[fo\]\* > /tmp/mynewfile.txt        
兩種方法都能同樣地起作用。既然我們談到反斜杠擴展,那么現在是時候提一提了,為了指定文字\,您可以將它放入單引號中,或者也可以輸入\\(它將被擴展為\)。        
    請注意雙引號的作用和單引號很接近,而雙引號還允許 bash 做一些有限的擴展。因此,當您確實想要把文字文本傳給命令時,單引號是最好的選擇。

(5)專用字符集合

  [:digit:]:任意數字,相當于0-9

  [:lower:]:任意小寫字母

  [:upper:]:任意大寫字母

  [:alpha:]:任意大小寫字母

  [:alnum:]:任意數字或字母

  [:space:]:空格

  [:punct:]:標點符號

    注意:引用時,需要在加一層括號

2.正則表達式

1、什么是正則表達式?       
    正則表達式(也稱為“regex”或“regexp”)是一種用來描述文本模式的特殊語法。在 Linux 系統上,正則表達式通常被用來查找文本的模式,以及對文本流執行“搜索-替換”操作以及其它功能。        
2、與 glob 的比較        
   當我們看到正則表達式時,您可能發現正則表達式的語法看起來與我們上一篇教程(請參閱本教程最后的“參考資料”一節中列出的“第 1 部分”)中研究的“文件名匹配替換”語法相類似。但是,不要讓它欺騙您;它們的類似性只是表面的。雖然正則表達式和文件名匹配替換模式可能看上去相類似,但是它們是根本不同的兩種類型。        
3、簡單子串        
   記住那個警告,讓我們看一下最基本的正則表達式,簡單子串。為了這樣做,我們要使用 grep,它是一個掃描文件內容來查找適合特定正則表達式的命令。grep 打印與正則表達式匹配的每一行,并忽略與之不匹配的每一行:        
$ grep bash /etc/passwd        
operator:x:11:0:operator:/root:/bin/bash        
root:x:0:0::/root:/bin/bash        
ftp:x:40:1::/home/ftp:/bin/bash        
在上面的命令中,grep 的第一個參數是一個正則表達式;第二個參數是一個文件名。grep 讀取 /etc/passwd 中的每一行并對它應用簡單子串正則表達式 bash 來查找匹配項。如果找到一個匹配項,那么 grep 打印出整行;否則,忽略該行。        
4、理解簡單子串        
    一般來說,如果您正在搜索一個子串,那么您可以不提供任何“特殊”字符,而只是逐字地指定文本。只有在子串包含 +、.、*、[、] 或 /(在這樣的情況下,這些字符需要用引號括起來并在它們的前面使用反斜杠)才需要做特殊的事情。下面是簡單子串正則表達式幾個其它示例:        
   tmp (掃描查找文字串 tmp)        
 “\[box\]”(掃描查找文字串 [box])        
 “\*funny\*”(掃描查找文字串 *funny*)        
 “ld\.so”(掃描查找文字串 ld.so)        
5、元字符        
    使用正則表達式,可以利用元字符來執行比我們至今已研究過的示例復雜得多的搜索。這些元字符中的一個是 .(點),它與任何單個字符匹配:        
$ grep dev.hda /etc/fstab        
/dev/hda3 reiserfs noatime,ro 1 1        
/dev/hda1 /boot reiserfs noauto,noatime,notail 1 2        
/dev/hda2 swap sw 0 0        
#/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1        
    在本示例中,文字文本 dev.hda 沒有出現在 /etc/fstab 中的任何一行中。但是,grep 掃描這些行時沒有查找文字 dev.hda 字符串,而是查找 dev.hda 模式。請記住 . 將與任何單個字符相匹配。正如您看到的,. 元字符在功能上等價于 glob 擴展中 ? 元字符的工作原理。        
6、使用 []        
   如果我們希望與比 . 更具體一點地來匹配字符,那么我們可以使用 [ 和 ](方括號)來指定要匹配的字符子集:        
$ grep dev.hda[12] /etc/fstab        
/dev/hda1 /boot reiserfs noauto,noatime,notail 1 2        
/dev/hda2 swap swap sw 0 0  

 [\u4e00-\u9fa5] : 表示任意一個漢字 
 正如您看到的,這個特殊語法的作用與“glob”文件名擴展中的 [] 相同。        
7、使用 [^]        
    通過使 [ 后面緊跟一個 ^,您可以使方括號中的意思相反。在本例中,方括號將與未列在方括號內的任意字符匹配。同樣,請注意我們在正則表達式中使用 [^] ,而在 glob 中使用 [!] :        
$ grep dev.hda[^12] /etc/fstab        
/dev/hda3 reiserfs noatime,ro 1 1        
/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1        
8、區別語法        
    注意下面一點很重要:方括號內部的語法根本不同于正則表達式其它部分中的語法。例如,如果在方括號內放置一個 . ,那么它允許方括號與文字 . 匹配,就象上面示例中的 1 和 2。比較起來,除非有\ 作為前綴,否則方括號外面的文字 . 被解釋為一個元字符。通過輸入如下命令,我們可以利用這一事實來打印 /etc/fstab 中包含文字串 dev.hda 的所有行的列表:        
$ grep dev[.]hda /etc/fstab        
或者,我們也可以輸入:        
$ grep "dev\.hda" /etc/fstab        
這兩個正則表達式都不可能與您的 /etc/fstab 文件中的任何行相匹配。        
9、“*”元字符        
    某些元字符本身不匹配任何字符,但卻修改前一個字符的含義。一個這樣的元字符是 * (星號),它用來與前一個字符的零次或者多次重復出現相匹配。這里是一些示例:        
 ab*c(與 abbbbc 匹配但不與 abqc 匹配)        
 ab*c(與 abc 匹配但不與 abbqbbc 匹配)        
 ab*c(與 ac 匹配但不與 cba 匹配)        
 b[cq]*e(與 bqe 匹配但不與 eb 匹配)        
 b[cq]*e(與 bccqqe 匹配但不與 bccc 匹配)        
 b[cq]*e(與 bqqcce 匹配但不與 cqe 匹配)        
 b[cq]*e(與 bbbeee 匹配)        
 .*(與任何字符串匹配)        
 foo.*(與以 foo 開始的任何字符串相匹配)        
 ac 行與正則表達式 ab*c 相匹配,因為星號也允許前面的表達式(b)出現零次。請注意解釋 * 正則表達式元字符所用的方法與解釋 * glob 字符的方法根本不同。        
10、行的開始和結束        

    我們在這里要詳細描述的最后幾個元字符是 ^ 和 $ 元字符,它們用來分別與行的開始和結束相匹配。通過在正則表達式開始處使用一個 ^ ,您可以將您的模式“錨定”在行的開始。在下面的示例中,我們使用 ^# 正則表達式來與以 # 字符開始的任何行相匹配:        
$ grep ^# /etc/fstab        
# /etc/fstab: static file system information.        
#        
11、完整行正則表達式        
    可以組合 ^ 和 $ 來與完整的行相匹配。例如,下面的正則表達式將與以 # 字符開始并以 . 字符結束的行相匹配,在其中間可以有任意多個其它字符:        
$ grep '^#.*/.$' /etc/fstab        
# /etc/fstab: static file system information.        
在上面的示例中,我們用單引號將我們的正則表達式括起來以阻止 shell 解釋 $ 。在不使用單引號的情況下,grep 甚至沒有機會查看 $,$ 就從我們的正則表達式上消失了。

正則總結(轉)

元字符        
    .     :
小數點可以匹配除“\n”以外的任意一個字符。如果要匹配包括“\n”在內的所有字符,一般用[\s\S],或者是用“.”加(?s)匹配模式來實現。        
    [abc] :匹配方括號中的任意一個字符??梢允褂?表示字符范圍,如[a-z0-9]匹配小寫字母和阿拉伯數字。        
    [^abc] :在方括號內開頭使用^符號,表示匹配除方括號中字符之外的任意字符。       |    : 表示或 
\d 匹配阿拉伯數字,等同于[0-9]。        
\D 匹配阿拉伯數字之外的任意字符,等同于[^0-9]。        
\x 匹配十六進制數字,等同于[0-9A-Fa-f]。        
\X 匹配十六進制數字,等同于[^0-9A-Fa-f]。        
\w 匹配單詞字母,等同于[0-9A-Za-z_]。        
\W 匹配單詞字母之外的任意字符,等同于[^0-9A-Za-z_]。        
\t 匹配<TAB>字符。        
\s 匹配空白字符,等同于[ /t]。        
\S 匹配非空白字符,等同于[^ /t]。        
\a 所有的字母字符. 等同于[a-zA-Z]        
\l 小寫字母 [a-z]        
\L 非小寫字母 [^a-z]        
\u 大寫字母 [A-Z]        
\U 非大寫字母 [^A-Z]        

表示數量的元字符

        
元字符         說明        
*              匹配0-任意個        
\+             匹配1-任意個        
\?             匹配0-1個        
\{n,m\}        匹配n-m個        
\{n\}          匹配n個        
\{n,\}         匹配n-任意個        
\{,m\}         匹配0-m個        

換行符         說明

\r,\n          回車和換行

\\             匹配‘\’

\^,\$,\.       匹配“^”“$”“.”    

以下字符在匹配其本身時,通常需要進行轉義。在實際應用中,根據具體情況,需要轉義的字符可能不止如下所列字符 : $  ^  {  [  (  |  )  *  +  ?  \  
表示位置的符號    
$   匹配行尾     
^   匹配行首      
\<  匹配單詞詞首      
\>  匹配單詞詞尾  
   
\b  匹配單詞邊界 
 

      

   
    
   

原創文章,作者:血刀老祖,如若轉載,請注明出處:http://www.www58058.com/11356

(1)
血刀老祖血刀老祖
上一篇 2016-02-28 12:17
下一篇 2016-02-28 12:21

相關推薦

  • N25第六周作業

    vim編輯器 基本模式: 編輯模式,命令模式 輸入模式 末行模式: 內置的命令行接口;   打開文件: # vim [options] [file ..] +#:打開文件后,直接讓光標處于第#行的行首; +/PATTERN:打開文件后,直接讓光標處于第一個被PATTERN匹配到的行的行首;   模式轉換: 編輯模式:默認模式 編輯模式 &…

    Linux干貨 2017-02-15
  • Net22-第一周作業-linux基礎知識

    1、描述計算機的組成及其功能。    計算機硬件由五大部件組成,分別是運算器、控制器、存儲器、輸入和輸出設備組成。 其中,運算器和控制器合稱為cpu,接受指令,加工數據。 存儲器又分為內存和外存(硬盤、U盤等等),這里指的是內存,給cpu提供數據和指令。 輸入設備對數據進行輸入,如鼠標,鍵盤等。 輸出設備對計算結果進行顯示或者打印等,如顯…

    Linux干貨 2016-08-22
  • vsftpd 配置文件的一些設置

    ftp:File Transfer protocol 文件傳輸協議 兩個連接: tcp:命令連接 tcp:數據連接 主動模式:服務器端通過20端口主動連接客戶端,客戶端監聽在于服務器端的建立連接的端口+1上,服務器工作在tcp/20 被動模式:客戶端使用自己與服務器端建立端口+1上連接客戶端的隨機端口 防火墻上連接追蹤 數據要流失化文本:文件流二進制 c/s…

    Linux干貨 2017-09-10
  • nginx提供web服務——虛擬主機

    練習:定義四個虛擬主機,混合使用三種類型的虛擬主機;   僅開放給來自于本地網絡中的主機訪問; [root@node1 ~]# vim /etc/nginx/nginx.conf user           …

    Linux干貨 2016-10-23
  • N26 – 第三周作業

    1、列出當前系統上所有已登錄的用戶的用戶名,同一用戶登錄多次只顯示一次     ~]# who -u |cut -d ' ' -f1|uniq -u 2、最后登錄到當前系統的用戶的相關信息     ~]#id $(last | h…

    Linux干貨 2017-01-03
  • N25-第10周博客作業

    請詳細描述CentOS的啟動流程     啟動第一步–加載BIOS         當打開計算機電源,計算機會首先加載BIOS信息,BIOS信息是如此的重要,以至于計算機必須在最開始就找到它,這是因為BIOS中包含了CPU的相關信息、設備啟動順序信息、硬盤信息、內存信息…

    Linux干貨 2017-03-10

評論列表(1條)

  • stanley
    stanley 2016-02-28 12:20

    寫的不錯,你將擁有自主發布文章的權限,相信會一如既往的好

欧美性久久久久