歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> 正則表達式 Linux Shell

正則表達式 Linux Shell

日期:2017/3/1 11:07:24   编辑:SHELL編程

正則表達式

熱身

正則表達式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。

例如 grep, expr, sed , awk. 或Vi中經常會使用到正則表達式,為了充分發揮 shell 編程的威力,需要精通正則表達式。

下面先舉個簡單例子來讓大家對正則表達式有個直觀的感受。ls命令是linux下最常用的命令。ls命令是list的縮寫,缺省下ls用來打印出當前目錄的清單。

現在,我們只希望列出以d開頭的文件或目錄,可以用ls d* 命令,這裡*就是正則表達式,它表示匹配重復零次或多次前一字符。

舉一反三,列出以che 開頭的文件或目錄,就可以用ls che* 命令。

是不是覺得有些覺得過於簡單了啊??!!好吧,打完小怪,現在升下級。

開始……

如何列出當前目錄下的所有目錄(不包含下面的子目錄)?

思考……

又到了使出正則表達式殺手锏的時候了,在這裡,我們還是使用ls 命令,但是加了個 -l選項(-l選項作用是列出文件的詳細信息),使用正則表達式列出當前目錄下的所有目錄,我們給出了兩種方法(聰明的你當然會想到也可以用find命令,呵呵,這屬於第三種秘笈了)。且看:

這樣列出來的內容有些多,沒完全截下來所有顯示結果,但這並不妨礙本文的講解。

考慮到普通文件是以-開頭,如dataf1.txt文件;目錄是以d 開頭的,如 adv_shell 是目錄,即第一個字母會不小心暴露出文件的身份屬性。

所以我們就從d這裡作為突破口,這時,你會想到,有多少個“開頭”的d就應該有多少個目錄,太聰明了,好吧,我們按照你的思路實踐下。

現在,問題出來了,怎麼統計出來有多少個“開頭”的d?你想到了linux中grep命令,還想到了正則表達式,於是grep和正則表達式開始粉墨登場了……

ls -l |grep "^d"

這條簡單的命令就輕松解決了我們的問題,。"^d"???你納悶了,這個小東西配合起來怎麼會有那麼大的威力呢?這好比玩三國殺時劉備、司馬懿、香香之間配合的威力……"^d",就是正則表達式的用法,"^"表示匹配行首,"^d"合起來就表示以d開頭的一行,grep "^d" 就是過濾出以d開頭的那些行,d 表示目錄,也就過濾出了當前目錄中的所有目錄。

謎底解開。現在你又想到,前面不是說還有一種方法的麼,既然如此迫不及待,那就只好順水推舟了。

第二種方法還是基於ls命令,但是用了-F 選項,-F 選項能列出文件類型的指示符號,如下圖所示:

仔細觀察我們發現,在文件名後面,會多出了一些符號,如目錄adv_shell名字後多了條斜扛(/),可執行文件checkhost.sh名字後多了個星號(*)……在此,如果想更多了解這些符號意義,可以查看ls 命令的詳細信息。

我們現在把注意力集中到目錄adv_shell名字後多了條斜扛(/)這條信息上。很快聯想到,有多少個斜扛(/)就應該對應多少目錄,而且斜扛(/)會跟在每個目錄名的最後。我們又想到了grep命令,還想到了應該怎樣用正則表達式表示出匹配行尾,答案已經很接近了……

ls -F | grep "/$"

這條短命令又一切成全了我們的夢想。"/$" 也是正則表達式的用法,"$"表示匹配行首,"/$"合起來就表示匹配以/結尾的行,grep "/$" 就是過濾出以/結尾的那些行,/表示目錄,也就過濾出了當前目錄中的所有目錄。

在此基礎上,我們發散一下思維,比如說想統計當前目錄下的文件個數及目錄個數,就可以使用以下命令:

ls -l * |grep "^-"|wc -l

ls -l * |grep "^d"|wc -l

好了,暫且休息,下面我們開始介紹更多關於正則表達式的知識。

Copyright © Linux教程網 All Rights Reserved