基礎正規表示法:
php
--------------------------------------------------------------------------------html
grep
語法: [root @test /root ]# grep [-acinv] '搜尋字符串' filename
參數說明:
-a :將 binary 檔案以 text 檔案的方式搜尋數據
-c :計算找到 '搜尋字符串' 的次數
-i :忽略大小寫的不一樣,因此大小寫視爲相同
-n :順便輸出行號
-v :反向選擇,亦即顯示出沒有 '搜尋字符串' 內容的那一行!
範例:
[root @test /root]# grep 'root' /var/log/secure
將 /var/log/secure 這個檔案中有 root 的那一行秀出來
[root @test /root]# grep -v 'root' /var/log/secure
若該行沒有 root 纔將數據秀出來到屏幕上!linux
[root @test /root]# last | grep root
若該行有 root 纔將數據秀出來到屏幕上!app
[root @test /root]# grep [A-Z]ANPATH /etc/man.config
將 /etc/man.config 這個檔案當中,全部有:
[任何一個大寫字符]後面接 ANPATH 的那一行就顯示出來!
例如 AANPATH, BANPATH.... ZANPATH 等等!
說明:
grep 是一個很常見的指令,最重要的功能就是進行字符串數據的比對了,須要說明的是『grep 在一個檔案中查尋一個字符串時,他是以"整行"爲單位來數據的擷取的!』也就是說,假如一個檔案內有 10 行,其中有兩行具備你所搜尋的字符串,則將那兩行顯示在屏幕上,其它的就丟棄了!而 grep 除了能夠進行檔案的資料搜尋以外,也經常被應用在 input/output 的數據處理當中,例如常見的管線命令 ( pipe ) 就能夠經常見到他的蹤跡!以上面的例子來看,咱們能夠發現前兩個例子是查尋檔案的內容,有沒有加上 -v 所顯示出來的結果是『相反的!』,而第三個例子則是以 pipe 的功能進行數據的處理的喔!至於最後一個例子比較特殊,使用到中括號 [] ,這是什麼意思呢?
在中括號裏面『只有一個字符』,而裏面的內容就是『字符的範圍』啦!因此呢[A-Z]就是指:『A到Z當中的任何一個字符都能被接受,可是隻有一個字符』的意思!因此,若是我想要全部的數字都接受,那就是[0-9],若是我只要接受 1,3,5 呢?就是[135]或者能夠用逗號隔開[1,3,5]!因此啦,那個減號 - 在中括號當中,表明『一個範圍(range)』的意思啦!中括號還有不少用途呢!底下會更詳細介紹!
grep 是最簡單的正規表示法搜尋指令之一,他並不支持一些更嚴謹的正規表示法內容,不過,已經至關的好用啦!底下咱們就以一個檔案作爲練習吧!先來查看一下這個檔案內容:
[root @test /root ]# vi regexp.txt
This is a cat, however, I need a dog.
I want to "Happy" and <Happy> and /Happy/ here.
* I don't know how to do this *
# I don't Know how to do this $
^ I don't KNOW how to do this @
OK! everythins is OK
Now, I will eat my food
are you finished your work
what do you 123 goto where
tesaaaaatest
quit bbbbqqa testglgs
i will shutdown my mechine
bye bye
這個檔案是鳥哥在 MS dos 的環境中編輯的,因此他還含有一些特殊的字符喔!使用 vi 來查看的時候尚未很清楚,若是使用 cat -A 來查看時,會出現什麼呢?
[root @test /root ]# cat -A regexp.txt
This is a cat, however, I need a dog.^M$
I want to "Happy" and <Happy> and /Happy/ here.^M$
* I don't know how to do this *^M$
# I don't Know how to do this $^M$
^ I don't KNOW how to do this @^M$
OK! ^Ieverythins is OK^M$
Now, I will eat my food^M$
are you ^Ifinished your work^M$
what do you 123 goto where^M$
tesaaaaatest^M$
quit bbbbqqa testglgs^M$
i will shutdown my mechine^M$
bye bye^M$
上面粗體的地方就是 DOS 檔案底下的特殊字符啦!比較一下用 vi 與 cat -A 秀出來的結果有什麼不一樣?而主要的 DOS 字符有:
^M :表示斷行字符;
^I :表示 <tab> 形成的按鍵符號;
$ :表示每一行的行尾之意!
這個 regexp.txt 檔案你能夠在 http://linux.vbird.org/download/index.php#regular 下載回去作練習喔!好了,假設你已經將這個檔案給他捉到本身的 Linux 底下了,此時,應該要來作一些小練習囉!趕忙看看吧!
例題一:找出這個檔案裏面含有 know 這個字符,並將行號列出來:
[root @test /root ]# grep -n 'know' regexp.txt
3:* I don't know how to do this *
grep 會一行一行的去比對 know 這個字符串,請注意,大小寫是不同的!
當該行裏面沒有 know 這個字符串時, grep 就會將該行捨棄而不顯示出來,
不過,到第三行時,出現了 know 了,因此第三行就會被顯示出來啦!
例題二:找出這個檔案裏面含有 * 這個字符,並將行號列出來:
[root @test /root ]# grep -n '\*' regexp.txt
3:* I don't know how to do this *
請特別留意喔,在正規表示法裏面有至關多的『特殊字符』存在,而要
取消掉這些特殊字符的屬性時,反斜線『\』的存在就顯的特別重要了!
在這個例子中,或許你會發現使用 grep -n '*' regexp.txt 也能夠獲得
相同的結果,可是,良好的習慣是須要養成的,這裏,請以較爲正統的
正規表示法來去除 * 這個特殊字符的屬性,對您之後必定會有不少的好處的!ui
例題三:我要將全部 know 不論大小寫都列出來,並列出行號:
[root @test /root]# grep -ni 'know' regexp.txt
3:* I don't know how to do this *
4:# I don't Know how to do this $
5:^ I don't KNOW how to do this @
若是不理會大小寫的差別,加入 -i 這個參數吧!列出行號就以 -n 來達成!
this
--------------------------------------------------------------------------------.net
正規表示法的特殊字符(charaters)與 egrep 指令
正規表示法不止於尋找簡單的字符串,他還有至關多的額外功能提供咱們使用者組合、分析字符串,底下咱們先來列出幾個常見的正規表示法的特殊字符,搭配剛剛您下載的檔案,而後再以右邊的範例來實習一下吧!
特殊字符 表示意義與範例
^word 意義:待搜尋的字符在行首
說明:
搜尋 word 這個字符串,『而且 word 必需爲這一行的行首』。
範例:
找出檔案中以 i 爲開頭的那一行,而且忽略大小寫:
[root@test root]# grep -in '^i' regexp.txt
2:I want to "Happy" and <Happy> and /Happy/ here.
12:i will shutdown my mechine
word$ 意義:待搜尋的字符在行尾
說明:
搜尋 word 這個字符串,而且 word 必需爲這一行的行尾
範例:
因爲鳥哥提供的檔案實際上是 DOS 檔案下的產物,因此字尾都會存在着 ^M 的字符,所以,咱們先以 tr 這個指令將這個字符給他去掉,而後再找出字尾爲 ye 的那一行,並顯示出來!關於更多的 tr 指令的用法,咱們會在後面進行說明。
[root@test root]# cat regexp.txt|tr -d '\r' grep -n 'ye$'
13:bye bye
. 意義:表明『一個』任意字符,必定要有『一個字符』存在
說明:
這個『.』在正規表示法當中很經常使用,表明的是『一個』任意字符,不是 0 個也不是多個,偏偏好就是『一個』。
範例:
我要將檔案中有 e 與 t 而且中間含有一個字符的該行抓出來,注意喔! e 與 t 的中間必定會有一個字符存在纔是成功的喔!例以下列範例:
[root@test root]# grep -n 'e.t' regexp.txt
7:Now, I will eat my food
10:tesaaaaatest
11:quit bbbbqqa testglgs
\ 跳脫符號將特殊字符變成普通字符
? 任何一個『單一』字符
* 隨意幾個任意字符
[list] 列表中的字符
[range] 列表中範圍內的字符
[^list] 反向選擇,與 [list] 相反
[^range] 反向選擇,與 [range]相反
\{n\} 與前一個相同字浮連續 n 個
\{n,m\} 與前一個相同字浮連續 n-m 個
請特別留意的是,『正規表示法的特殊字符』與通常在指令列輸入指令的『萬用字符』並不相同,例如,在萬用字符當中, * 表明的是 0 ~ 無限多個字符的意思,可是在正規表示法當中, * 則是重複前一個字符的意思~使用的意義並不相同,不要搞混了!(鳥哥我一開始摸正規表示法時就很容易搞混!由於這裏是新手最容易搞錯的地方,特別當心啊!)
題:我想要知道,在 /etc 底下,只要含有 XYZ 三個字符的任何一個字符的那一行就列出來,要怎樣進行?
答:
『只要』含有 X 或 Y 或 Z 就將該行列出來,所以,咱們的範圍很很廣啦!這個時候就必須要使用到 [] 這個咚咚!還記得中括號的用途嗎?那就是『在中括號裏面謹表明一個字符而已!』而這個中括號是一個『表明』,能夠是一串字也能夠是幾個不連續的字!這裏咱們僅須要 XYZ 其中任何一個,因此能夠這樣寫:
grep [XYZ] /etc/*
則只要在每一行當中,只要發現 X 或 Y 或 Z 任何一個,就會將他印出來!這個與 grep XYZ /etc/* 是『徹底不同』的!請仔細的思考一下ㄟ!
例題:我想要知道在 /etc 裏面,只要句首是 w-z 的就將他印出來?
答:
一樣的,使用中括號!
grep ^[w-z] /etc/*
固然還有不少不少用法啦!畢竟一個正規表示法加上他附屬的一些指令,幾乎能夠出一本書了,這裏僅是想讓你們瞭解他的好處罷了!因此就寫到這裏!其它的,就等着您去參詳與發現囉!regexp
--------------------------------------------------------------------------------htm
diff
語法: [root @test /root ]# diff file1 file2
參數說明:
範例:
[root @test /root]# diff index.htm index.html
說明:
這是用來比較兩個檔案內容是否有不一致的指令!ip
--------------------------------------------------------------------------------
awk
語法: [root @test /root ]# last | awk '{print $1 " " $2}'
參數說明:
範例:
[root @test /root]#
說明:
施工中
--------------------------------------------------------------------------------
sed 語法: [root @test /root ]# last | sed 10,\$d 參數說明: 範例: [root @test /root]# 說明: 施工中