文本過濾工具(grep)

過濾httpd.conf中的註釋行
cat httpd.conf | grep -i "^ *[^ *#]" > my.conf
less /etc/postfix/main.cf |grep -n "^$"  顯示空行所在的行號
less /etc/postfix/main.cf |grep -c "^$" 顯示空行共有多少行
less /etc/postfix/main.cf |grep -v -n "^$" 顯示非空行 並加行號
less /etc/postfix/main.cf |grep -v -n "^#" 顯示非#行 並加行號
 
 
 
g r e p通常格式爲:
代碼:
 
grep [選項]基本正則表達式[文件]
這裏基本正則表達式可爲字符串。
 
 

單引號雙引號
在g r e p命令中輸入字符串參數時,最好將其用雙引號括起來。
在調用模式匹配時,應使用單引號。
例如:「m y s t r i n g」。這樣作有兩個緣由,一是以防被誤解爲s h e l l命令,二是能夠用來查找多個單詞組成的字符串。
在調用變量時,也應該使用雙引號,諸如: g r e p「$ M Y VA R」文件名,若是不這樣,將沒有返回結果。

經常使用的g r e p選項有:
引用:
 
-c 只輸出匹配行的計數。
-i 不區分大小寫(只適用於單字符)。
-h 查詢多文件時不顯示文件名。
-l 查詢多文件時只輸出包含匹配字符的文件名。
-n 顯示匹配行及行號。
-s 不顯示不存在或無匹配文本的錯誤信息。
-v 顯示不包含匹配文本的全部行。
 
 
開始討論以前,先生成一個文件,插入一段文本,並在每列後加入< Ta b >鍵,g r e p命令示例中絕大多數將以此爲例,其命名爲d a t a . . f。生成一個文件,d a t a . f的記錄結構以下:
引用:
 
第1列:城市位置編號。
第2列:月份。
第3列:存儲代碼及出庫年份。
第4列:產品代號。
第5列:產品統一標價。
第6列:標識號。
第7列:合格數量。
 
 
文件內容以下:
代碼:
 
$ cat data.f
48      Dec     3BC1977 LPSX    68.00   LVX2A   138
483     Sept    5AP1996 USP     65.00   LVX2C   189
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
219     dec     2CC1999 CAD     23.00   PLV2C   68
484     nov     7PL1996 CAD     49.00   PLV2C   234
483     may     5PA1998 USP     37.00   KVM9D   644
216     sept    3ZL1998 USP     86.00   KVM9E   234
 
 

_________________
 
 
一、查詢多個文件
在全部文件中查詢單詞「 sort it」
代碼:
 
$ grep "sort it" *
 
 
二、 行匹配
1)顯示包含「4 8」字符串的文本:
代碼:
 
$ grep  "48"data.f
 
 
2)輸出匹配行的總數
代碼:
 
$ grep -c "48"data.f
4
 

g r e p返回數字4,表示:包含字符串「4 8」的有4行。
3)行數
顯示知足匹配模式的全部行行數:
代碼:
 
$ grep -n "48"data.f
 

行數在輸出第一列,後跟包含4 8的每一匹配行。
4)顯示非匹配行
顯示全部不包含4 8的各行
代碼:
 
$ grep -v "48"data.f
 
 
5)精確匹配
可能你們已注意到,在上一例中,抽取字符串「 4 8」,返回結果包含諸如4 8 4和4 8 3等包含「4 8」的其餘字符串,實際上應精確抽取只包含4 8的各行。
使用g r e p抽取精確匹配的一種更有效方式是在抽取字符串後加\ >。假定如今精確抽取4 8,方法以下:
代碼:
 
$grep "48\>" data.f
 
 
引用:
 
另外一種方法我試過,好像不行:
注意在每一個匹配模式中抽取字符串後有一個< Ta b >鍵,因此應操做以下:
< Ta b >表示點擊t a b鍵。
$grep "48<tab>" data.f
 
 
6)大小寫敏感
缺省狀況下, g r e p是大小寫敏感的,如要查詢大小寫不敏感字符串,必須使用- i開關。在d a t a . f文件中有月份字符S e p t,既有大寫也有小寫,要取得此字符串大小寫不敏感查詢,方法以下:
代碼:
 
$grep -i "48" data.f
 
 

_________________
 
grep和正則表達式
使用正則表達式使模式匹配加入一些規則,所以能夠在抽取信息中加入更多選擇。使用正則表達式時最好用單引號括起來,這樣能夠防止g r e p中使用的專有模式與一些s h e l l命令的特殊方式相混淆。
一、模式範圍
抽取代碼爲4 8 4和4 8 3的城市位置,可使用[ ]來指定字符串範圍。
代碼:
 
$ grep "48[34]" data.f
483     Sept    5AP1996 USP     65.00   LVX2C   189
484     nov     7PL1996 CAD     49.00   PLV2C   234
483     may     5PA1998 USP     37.00   KVM9D   644
 
 
二、不匹配行首
使行首不是4或8,能夠在方括號中使用^記號。
代碼:
 
$ grep "^[^48]" data.f
219     dec     2CC1999 CAD     23.00   PLV2C   68
216     sept    3ZL1998 USP     86.00   KVM9E   234
 
 
若是是字符串48
代碼:
 
$ grep -v "^[^48]" data.f
 
 
三、設置大小寫
使用- i開關能夠屏蔽月份S e p t的大小寫敏感
代碼:
 
[sam@chenwy sam]$ grep -i "sept" data.f
483     Sept    5AP1996 USP     65.00   LVX2C   189
216     sept    3ZL1998 USP     86.00   KVM9E   234
 
 
也能夠用另外一種方式[ ]模式抽取各行包含S e p t和s e p t的全部信息。
代碼:
 
[sam@chenwy sam]$ grep '[sS]ept' data.f
 
 
若是要抽取包含S e p t的全部月份,無論其大小寫,而且此行包含字符串483,可使用管道命令,即符號「|」左邊命令的輸出做爲「 |」右邊命令的輸入。舉例以下:
代碼:
 
[sam@chenwy sam]$ grep '[sS]ept' data.f | grep 48
483     Sept    5AP1996 USP     65.00   LVX2C   189
 

沒必要將文件名放在第二個g r e p命令中,由於其輸入信息來自於第一個g r e p命令的輸出
四、匹配任意字符
若是抽取以K開頭,以D結尾的全部代碼,可以使用下述方法,由於已知代碼長度爲5個字符:
代碼:
 
[sam@chenwy sam]$ grep 'K...D' data.f
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
483     may     5PA1998 USP     37.00   KVM9D   644
 
 
將上述代碼作輕微改變,頭兩個是大寫字母,中間兩個任意,並以C結尾:
代碼:
 
[sam@chenwy sam]$ grep '[A-Z]..C' data.f
483     Sept    5AP1996 USP     65.00   LVX2C   189
219     dec     2CC1999 CAD     23.00   PLV2C   68
484     nov     7PL1996 CAD     49.00   PLV2C   234
 
 
五、日期查詢
一個經常使用的查詢模式是日期查詢。先查詢全部以5開始以1 9 9 6或1 9 9 8結尾的全部記錄。使用模式5 . . 1 9 9 [ 6 , 8 ]。這意味着第一個字符爲5,後跟兩個點,接着是1 9 9,剩餘兩個數字是6或8。
代碼:
 
[sam@chenwy sam]$ grep '5..199[6,8]' data.f
483     Sept    5AP1996 USP     65.00   LVX2C   189
483     may     5PA1998 USP     37.00   KVM9D   644
 
 
六、範圍組合
必須學會使用[ ]抽取信息。假定要取得城市代碼,第一個字符爲0-9,第二個字符在0到5之間,第三個字符在0到6之間,使用下列模式便可實現。
代碼:
 
[sam@chenwy sam]$ grep '[0-9][0-5[0-6]' data.f
48      Dec     3BC1977 LPSX    68.00   LVX2A   138
483     Sept    5AP1996 USP     65.00   LVX2C   189
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
219     dec     2CC1999 CAD     23.00   PLV2C   68
484     nov     7PL1996 CAD     49.00   PLV2C   234
483     may     5PA1998 USP     37.00   KVM9D   644
216     sept    3ZL1998 USP     86.00   KVM9E   234
 
 
這裏返回不少信息,有想要的,也有不想要的。參照模式,返回結果是正確的,所以這裏
代碼:
 
[sam@chenwy sam]$ grep '^[0-9][0-5[0-6]' data.f
219     dec     2CC1999 CAD     23.00   PLV2C   68
216     sept    3ZL1998 USP     86.00   KVM9E   234
 
這樣能夠返回一個預期的正確結果。
如下要注意有無邊界字符的區別
七、模式出現機率
抽取包含數字4至少重複出現兩次的全部行,方法以下:
代碼:
 
[sam@chenwy sam]$ grep '4\{2,\}' data.f
483     may     5PA1998 USP     37.00   KVM9D   644
 
上述語法指明數字4至少重複出現兩次,注意有無邊界字符的區別。
一樣,抽取記錄使之包含數字9 9 9(三個9),方法以下:
代碼:
 
[sam@chenwy sam]$ grep '9\{3,\}' data.f
219     dec     2CC1999 CAD     23.00   PLV2C   68
 
 
若是要查詢重複出現次數必定的全部行,語法以下,數字9重複出現兩次或三次:
代碼:
 
[sam@chenwy sam]$ grep '9\{3\}' data.f
219     dec     2CC1999 CAD     23.00   PLV2C   68
[sam@chenwy sam]$ grep '9\{2\}' data.f
483     Sept    5AP1996 USP     65.00   LVX2C   189
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
219     dec     2CC1999 CAD     23.00   PLV2C   68
484     nov     7PL1996 CAD     49.00   PLV2C   234
 
 
有時要查詢重複出現次數在必定範圍內,好比數字或字母重複出現2到6次,下例匹配數字8重複出現2到6次,並以3結尾:
代碼:
 
[sam@chenwy sam]$ cat myfile
83
888883
8884
88883
[sam@chenwy sam]$ grep '8\{2,6\}3' myfile
888883
88883
 
 
八、使用grep匹配「與」或者「或」模式
g r e p命令加- E參數,這一擴展容許使用擴展模式匹配。例如,要抽取城市代碼爲2 1 9或2 1 6,方法以下:
代碼:
 
[sam@chenwy sam]$ grep -E '219|216' data.f
219     dec     2CC1999 CAD     23.00   PLV2C   68
216     sept    3ZL1998 USP     86.00   KVM9E   234
 
 
九、空行
結合使用^和$可查詢空行。使用- c參數顯示總行數:
代碼:
 
[sam@chenwy sam]$ grep -c '^$' myfile
 

使用- n參數顯示實際在哪一行:
代碼:
 
[sam@chenwy sam]$ grep -c '^$' myfile
 
 
十、匹配特殊字符
查詢有特殊含義的字符,諸如$ . ' " * [] ^ | \ + ? ,必須在特定字符前加\。假設要查詢包含「.」的全部行,腳本以下:
代碼:
 
[sam@chenwy sam]$ grep '\.' myfile
 
 
或者是一個雙引號:
代碼:
 
[sam@chenwy sam]$ grep '\"' myfile
 
 
以一樣的方式,如要查詢文件名c o n f t r o l l . c o n f(這是一個配置文件),腳本以下:
代碼:
 
[sam@chenwy sam]$ grep 'conftroll\.conf' myfile
 
 
十一、查詢格式化文件名
使用正則表達式可匹配任意文件名。系統中對文本文件有其標準的命名格式。通常最多六個小寫字符,後跟句點,接着是兩個大寫字符。
代碼:
 
[sam@chenwy sam]$ grep '^[a-z]\{1,6\}\.[A-Z]\{1,2\}' filename
 

這個寫法我不知道有沒有錯
12 查詢IP地址
要查看n n n . n n n網絡地址,若是忘了第二部分中的其他部分,只知有兩個句點,例如n n n . n n . .。要抽取其中全部nnn.nnn IP地址,使用[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 0 \ { 3 \ } \。含義是任意數字出現3次,後跟句點,接着是任意數字出現3次,後跟句點。
代碼:
 
[0-9]\{3\}\.[0-9]\{3\}\.'
 
 
上面還有一點錯,改天更正

_________________
 
 
一、類名
g r e p容許使用國際字符模式匹配或匹配模式的類名形式。
類名及其等價的正則表達式類等價的正則表達式類等價的正則表達式
引用:
 
[ [ : u p p e r : ] ] [ A - Z ] [ [ : a l n u m : ] ] [ 0 - 9 a - zA-Z]
[ [ : l o w e r : ] ] [ a - z ] [ [ : s p a c e : ] ] 空格或t a b鍵
[ [ : d i g i t : ] ] [ 0 - 9 ] [ [ : a l p h a : ] ] [ a - z A - Z ]
 
 
例一:取以5開頭,後跟至少兩個大寫字母:
代碼:
 
$grep '5[[:upper:]][[:upper]]' data.f
 
 
取以P或D結尾的全部產品代碼:
代碼:
 
grep '[[:upper:]][[:upper:]][P,D]' data.f
 
 
二、使用通配符*的匹配模式
代碼:
 
$cat testfile
looks
likes
looker
long
 
 
試試以下:
代碼:
 
grep "l.*s" testfile
 
 
如在行尾查詢某一單詞,試以下模式:
代碼:
 
grep "ng$" testfile
 

這將在全部文件中查詢行尾包含單詞ng的全部行。
三、系統grep
文件passwd
代碼:
 
[root@Linux_chenwy sam]# grep "sam" /etc/passwd
sam:x:506:4::/usr/sam:/bin/bash
 

上述腳本查詢/ e t c / p a s s w d文件是否包含sam字符串
若是誤輸入如下腳本:
代碼:
 
[root@Linux_chenwy sam]# grep "sam" /etc/password
grep: /etc/password: 沒有那個文件或目錄
 

將返回g r e p命令錯誤代碼'No such file or directory'。
上述結果代表輸入文件名不存在,使用g r e p命令- s開關,可屏蔽錯誤信息。
返回命令提示符,而沒有文件不存在的錯誤提示。
代碼:
 
[root@Linux_chenwy sam]# grep -s "sam" /etc/password
 

若是g r e p命令不支持- s開關,可替代使用如下命令:
代碼:
 
[root@Linux_chenwy sam]# grep "sam" /tec/password >/dev/null 2>&1
 

腳本含義是匹配命令輸出或錯誤( 2 > $ 1),並將結果輸出到系統池。大多數系統管理員稱/ d e v / n u l l爲比特池,不要緊,能夠將之當作一個無底洞,有進沒有出,永遠也不會填滿。
上述兩個例子並不算好,由於這裏的目的只想知道查詢是否成功。
如要保存g r e p命令的查詢結果,可將命令輸出重定向到一個文件。
代碼:
 
[root@Linux_chenwy sam]# grep "sam" /etc/passwd >/usr/sam/passwd.out
[root@Linux_chenwy sam]# cat /usr/sam/passwd.out
sam:x:506:4::/usr/sam:/bin/bash
 

腳本將輸出重定向到目錄/ t m p下文件p a s s w d . o u t中。
使用ps命令
使用帶有ps x命令的g r e p可查詢系統上運行的進程。ps x命令意爲顯示系統上運行的全部進程列表。要查看D N S服務器是否正在運行(一般稱爲n a m e d),方法以下:
代碼:
 
[root@Linux_chenwy sam]# ps ax|grep "named"
2897 pts/1    S      0:00 grep named
 

輸出也應包含此g r e p命令,由於g r e p命令建立了相應進程, ps x將找到它。在g r e p命令中使用- v選項可丟棄p s命令中的g r e p進程。若是ps x不適用於用戶系統,替代使用ps -ef。這裏,因爲我沒有DNS服務,於是只有grep進程。
對一個字符串使用grep
g r e p不僅應用於文件,也可應用於字符串。爲此使用e c h o字符串命令,而後對g r e p命令使用管道輸入。
代碼:
 
[root@Linux_chenwy sam]# STR="Mary Joe Peter Pauline"
[root@Linux_chenwy sam]# echo $STR | grep "Mary"
Mary Joe Peter Pauline
 
匹配成功實現。
代碼:
 
[root@Linux_chenwy sam]# echo $STR | grep "Simon"
 
由於沒有匹配字符串,因此沒有輸出結果。
四、egrep
e g r e p表明e x p r e s s i o n或extended grep,適狀況而定。e g r e p接受全部的正則表達式, e g r e p的一個顯著特性是能夠以一個文件做爲保存的字符串,而後將之傳給e g r e p做爲參數,爲此使用- f開關。若是建立一個名爲g r e p s t r i n g s的文件,並輸入4 8 4和4 7:
代碼:
 
[root@Linux_chenwy sam]# vi grepstrings
[root@Linux_chenwy sam]# cat grepstrings
484
47
 
 
代碼:
 
[root@Linux_chenwy sam]# egrep -f grepstrings data.f
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
484     nov     7PL1996 CAD     49.00   PLV2C   234
 

上述腳本匹配d a t a . f中包含4 8 4或4 7的全部記錄。當匹配大量模式時, - f開關頗有用,而在一個命令行中敲入這些模式顯然極爲繁瑣。
若是要查詢存儲代碼3 2 L或2 C C,可使用(|)符號,意即「|」符號兩邊之一或所有。
代碼:
 
[root@Linux_chenwy sam]# egrep '(3ZL|2CC)' data.f
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
219     dec     2CC1999 CAD     23.00   PLV2C   68
216     sept    3ZL1998 USP     86.00   KVM9E   234
 
 
可使用任意多豎線符「 |」,例如要查看在系統中是否有賬號l o u i s e、m a t t y或pauline ,使用w h o命令並管道輸出至e g r e p。
代碼:
 
$who |egrep (louise|matty|pauline)
 
 
還可使用^符號排除字符串。若是要查看系統上的用戶,但不包括m a t t y和p a u l i n e,方法以下:
代碼:
 
$who |egrep -v '^(matty|pauline)'
 
 
若是要查詢一個文件列表,包括s h u t d o w n、s h u t d o w n s、r e b o o t和r e b o o t s,使用e g r e p可容易地實現。
代碼:
 
$egrep '(shutdown |reboot) (s)?' *
 
 
egrep我等待網中人的講解,嘿嘿
相關文章
相關標籤/搜索