Linux命令中正規表示式的運用

2021-06-15 21:56:20 字數 3748 閱讀 4184

發信人: suit (伊默), 信區: unix_linux

標  題: linux命令中正規表示式的運用

發信站: 鬱金香bbs站 (2023年12月02日23:01:37 星期四), 站內信件

posted by kreny at may 19, 2004 07:04 pm

trackback url:

linux的命令列可以勝任所有的工作,這和ms的產品有著很大的區別,到現在為止仍然有

很多的愛好者對敲鍵盤樂此不疲,而在繁重的管理工作和鍵盤工作中,正規表示式對於

簡化工作起到了很大的作用。

perl regular expressions man page.

一、正規表示式簡介

事實上,正規表示式不僅適用於linux,多種程式語言中也可以使用到它,因為它實際上

是人們對於某種規律的表達方式。

如果要把他的所有應用都講上的話那這篇文章會變的太長以至於無法閱讀,我只介紹他

在linux下和幾種最重要的命令的搭配使用。

基本的元字符集:

^行首$行尾

*匹配星號前的字元一次或多次

匹配內的字元,可以是乙個字元也可以是字元列

/用來遮蔽乙個元字元的特殊含義,可以使其失去原有的意義。

pattern/用來匹配前面pattern出現的次數。n為次數。

而其中使用最多的是行首和行尾,無論在任何地方都可能會用到它們,比如vi,你輸入$

,就可以跳到行尾,在bbs上,你也可以輸入$,直接跳到這個版的最後的一篇文章。

後面所說的將是他們的和具體命令結合的例子。

二、grep 和正規表示式

grep是個非常常用的工具,linux其實和internet一樣,都是乙個充滿了大量資訊、資料

的東西,如何有效的過濾自己不用的資訊、獲取有用的資訊反映了乙個人水平的高低,

當我還是linux新手的時候還不懂得用grep呢。

乙個最簡單的應用例子就是如何檢視乙個目錄裡只檢視資料夾了,ls並沒有提供這樣的

引數給你,而是需要你用grep(或後面提到的awk)來實現這樣的功能。我們知道乙個文

件夾的屬性為d***,所以我們可以用ls -l |grep ^d,即列印匹配行首第乙個字母為d的

專案,這樣就把所有的資料夾列印出來而忽略其他非資料夾的檔案了,舉一反三,我們

可以用來匹配所有的許可權,比如我想找到所有許可權為rwx------的檔案,這樣我們就可以

輸入ls -l|grep ^.rwx,其中.號為匹配任意乙個字元。再看下面的例子,想找許可權為--

--rw----的檔案,可以使用ls -l|grep ^....rw....,怎麼樣,這樣簡單多了吧,我們

還可以尋找所有以*號結尾的檔案(在某些linux上用它來代表可執行檔案)即ls |grep

/*$,要注意的是必須加/以遮蔽*號的原來的特殊意義,而$號是加在行尾的。

可以用^符號來再非正規表示式的意思(即否定)如前面我說了要看資料夾,那麼如果我

想看不是資料夾的檔案怎麼辦 : ls -l|grep ^[^d],這樣的意思就是說檢視所有行首不

為d字母的項,當然也可以用grep 的-v選項實現同樣功能。不過今天重點是說正則表達

式,所以就不講引數了。

我還可以查詢多個檔案,如有乙個目錄裡面有我需要的內容,我只知道他在某個.doc文

件裡頭,我可以用grep "表示式" *.doc,而這個表示式就需要你去想了,有多種方法可

以指定模糊的表示式,如k...d,代表以小寫字母k開頭,中間三個是任意字元而以大寫

字母d結尾的字串,而k*d,則表達以k開頭中間可以是任意長度任意字元的而以d結尾

的字串,還可以用指定範圍,如[12345]day,指的是以1到6中任意乙個字元開頭後

面是day的字串,像3day就匹配這個表示式而13day就不匹配。[ss]可以指定以大寫s或

者小寫s的字元,而像結合pattern/還可以用更奇妙的用法,我就不多說了。

三、awk和正規表示式

awk對於從大的資料檔案中抽取指定的資料報十分有用,比如你可以用他來管理passwd文

件,或者是日誌檔案(相當巨大的檔案,而用了awk就會變的很輕鬆了),通常awk都是

和grep結合來用的,又grep抽出行,再有awk抽出行中指定的列,不過就算單獨用awk也

一樣好用。請看看這樣的例子

awk -f: '' /etc/passwd

這是個相當複雜的例子,我舉這個例子的目的只是為了說明結合命令語法和正規表示式

可以實現相當強的過濾作用,這個命令的作用是從passwd檔案中的第六列中抽取所有含

有bash的專案然後在列印這些專案的第一項即他們的使用者名稱。我假設passwd為這樣的內

容root:*:*:*:*:*:/bin/bash

user:*:*:*:*:*:/bin/bash

xie:*:*:*:*:*:/bin/csh

ftp:*:*:*:*:*:/bin/zsh

那麼輸出就應該為

root

user

我們逐個來分析,首先 -f:指定:為分隔符,因為預設的分隔符是空格,然後我們用乙個

假設語句,因為假設語句和後面的print組合成乙個動作,所以必須用花括號括起來,意

思是如果(if)第六列($6)匹配(~)字串bash,那麼列印(print)第零列($0)。

其中/bash/指的是匹配bash,//只是起括起來的作用,並不參與判斷。

awk有自己的正規表示式和條件操作符,他比一般的正規表示式要多出兩個元字元,就是

+和?,+使用匹配乙個或多個字元。?匹配模式出現頻率,例如使用/xy?z/匹配xyz,或y

z。條件操作符有

《小於<=小於等於

==等於(這個和c語言是一樣的)

!=不等於

>=大於等於

~匹配正規表示式

!~不匹配正規表示式

結合以上表示式,還可以作出更多的動作,如

ls -l|awk 'begin

end '

可以用此表示式來列印檔案名幾其長度,然後輸出所有檔案加起來的大小。

他相當與於我前面所說的先找出不是資料夾的檔案,然後列印他們的大小和長度,把這

些大小值放入變數tot中,放一次加一次(+=),最後列印tot,就可以把所有檔案的大

小求出來了。

邏輯符號

&& and,必須同時為真

! 非,求逆

awk '' /etc/passwd

當組和個人目錄都為root的時候列印使用者的名字。

嘿嘿,事實上awk還有算術操作符呢,我為了偷懶就不寫了,不過上面已經有例子了(用

了+=),就留給大家慢慢研究吧。

四、vi和正規表示式

文書編輯更加用用到正規表示式了,比如說在編輯狀態下輸入^,可以跳到行中第乙個非

空字元,輸入$,可以跳到本行行尾(在行號表示的時候,$代表最後一行)。輸入/可以

搜尋字串,同樣可以使用正規表示式匹配,如/^str,則匹配行首的str,輸入/str$,

則匹配行尾的str。其他的和正規表示式方法一樣。

五、總結

linux還有更複雜的sed也會用到正規表示式,事實上大部分和資訊過濾有關的都離不開

他,不過小子才疏學淺,實在是寫不了了,僅以此文拋磚引玉,不過各位大俠可千萬別

因為我這篇文章寫的差而全把磚頭往我招呼啊……

還有一點是給初學者的:記得多用|管道和檔案操作符啊,0代表標準輸入、1代表標準輸

出、2代表錯誤輸出,其他還有3-9你是可以任意使用的,如可以先把某檔案指到操作符4

,再把4指向0,那麼就可以作為程式的輸入了。

linux中正規表示式簡介

1.正規表示式 正規表示式 regular expression,簡寫re 是通過一些特殊字元的排列組成。正規表示式並不是乙個工具程式,而是一種字串處理的標準依據。如果想要使用正規表示式來處理字串,就必須使用支援正規表示式的工具程式才行,這類工具有很多,比如sed,awk,grep等。值得注意的是,...

JS中正規表示式

js中正規表示式有幾種不同的使用方法,一些用法是通過字串物件來使用,另外一些通過正規表示式物件使用。一 regexp 正規表示式 的屬性和方法 1 屬性 regexp的例項有幾個唯讀的屬性 global表示是否為全域性匹配,igorecase表示是否忽略大小寫,multiline表示是否為多行匹配,...

PHP中正規表示式

正規表示式一般表示式的形式如下 love 其中位於 定界符之間的部分就是將要在目標物件中進行匹配的模式。為了能夠使使用者更加靈活的的定製模式內容,正規表示式提供了專門的 元字元 所謂元字元就是指那些表示式中具有特殊意義的字元,可以用來規定其前導字元 即在元字元前面的字元 在目標物件中的出現模式。較為...