grep 與egrep詳解

1. grep 介紹

grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。

Unix的grep家族包括grepegrepfgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。

2. grep參數

-V: 打印grep的版本號

-E: 解釋PATTERN作爲擴展正則表達式,也就相當於使用egrep。 或操作

-F :   解釋PATTERN作爲固定字符串的列表,由換行符分隔,其中任何一個都要匹配。也就相當於使用fgrep。

-G:   將範本樣式視爲普通的表示法來使用。這是默認值。加不加都是使用grep。

匹配控制選項:

-e :  使用PATTERN作爲模式。這可以用於指定多個搜索模式,或保護以連字符( - )開頭的圖案。指定字符串做爲查找文件內容的樣式。   

-f :  指定規則文件,其內容含有一個或多個規則樣式,讓grep查找符合規則條件的文件內容,格式爲每行一個規則樣式。

-i :  搜索時候忽略大小寫

-v:  反轉匹配,選擇沒有被匹配到的內容。

-w:匹配整詞,精確地單詞,單詞的兩邊必須是非字符符號(即不能是字母數字或下劃線)

-x:僅選擇與整行完全匹配的匹配項。精確匹配整行內容(包括行首行尾那些看不到的空格內容都要完全匹配)

-y:此參數的效果和指定“-i”參數相同。

一般輸出控制選項:

-c: 抑制正常輸出;而是爲每個輸入文件打印匹配線的計數。

--color [= WHEN]:讓關鍵字高亮顯示,如--color=auto

-L:列出文件內容不符合指定的範本樣式的文件名稱

-l : 列出文件內容符合指定的範本樣式的文件名稱。

-m num:當匹配內容的行數達到num行後,grep停止搜索,並輸出停止前搜索到的匹配內容

-o: 只輸出匹配的具體字符串,匹配行中其他內容不會輸出

-q:安靜模式,不會有任何輸出內容,查找到匹配內容會返回0,未查找到匹配內容就返回非0

-s:不會輸出查找過程中出現的任何錯誤消息,-q和-s選項因爲與其他系統的grep有兼容問題,shell腳本應該避免使用-q和-s,並且應該將標準和錯誤輸出重定向到/dev/null 代替。

輸出線前綴控制:

-b:輸出每一個匹配行(或匹配的字符串)時在其前附加上偏移量(從文件第一個字符到該匹配內容之間的字節數)

-H:在每一個匹配行之前加上文件名一起輸出(針對於查找單個文件),當查找多個文件時默認就會輸出文件名

-h:禁止輸出上的文件名的前綴。無論查找幾個文件都不會在匹配內容前輸出文件名

--label = LABEL:顯示實際來自標準輸入的輸入作爲來自文件LABEL的輸入。這是特別在實現zgrep等工具時非常有用,例如gzip -cd foo.gz | grep --label = foo -H的東西。看到 也是-H選項。

-n:輸出匹配內容的同時輸出其所在行號。

-T:初始標籤確保實際行內容的第一個字符位於製表位上,以便對齊標籤看起來很正常。在匹配信息和其前的附加信息之間加入tab以使格式整齊。

上下文線控制選項:

-A num:匹配到搜索到的行以及該行下面的num行

-B num:匹配到搜索到的行以及該行上面的num行

-C num:匹配到搜索到的行以及上下各num行

文件和目錄選擇選項:

-a: 處理二進制文件,就像它是文本;這相當於--binary-files = text選項。不忽略二進制的數據。  

 --binary-files = TYPE:如果文件的前幾個字節指示文件包含二進制數據,則假定該文件爲類型TYPE。默認情況下,TYPE是二進制的,grep通常輸出一行消息二進制文件匹配,或者如果沒有匹配則沒有消息。如果TYPE不匹配,grep假定二進制文件不匹配;這相當於-I選項。如果TYPE是文本,則grep處理a二進制文件,如果它是文本;這相當於-a選項。警告:grep --binary-files = text可能會輸出二進制的垃圾,如果輸出是一個終端和如果可能有討厭的副作用終端驅動程序將其中的一些解釋爲命令。

-D:如果輸入文件是設備,FIFO或套接字,請使用ACTION處理。默認情況下,讀取ACTION,這意味着設備被讀取,就像它們是普通文件一樣。如果跳過ACTION,設備爲 默默地跳過。

-d:  如果輸入文件是目錄,請使用ACTION處理它。默認情況下,ACTION是讀的,這意味着目錄被讀取,就像它們是普通文件一樣。如果跳過ACTION,目錄將靜默跳過。如果ACTION是recurse,grep將遞歸讀取每個目錄下的所有文件;這是相當於-r選項。

--exclude=GLOB:跳過基本名稱與GLOB匹配的文件(使用通配符匹配)。文件名glob可以使用*,?和[...]作爲通配符,和\引用通配符或反斜槓字符。搜索其文件名和GLOB通配符相匹配的文件的內容來查找匹配使用方法:grep -H --exclude=c* "old" ./*  c*是通配文件名的通配符./* 指定需要先通配文件名的文件的範圍,必須要給*,不然就匹配不出內容,(如果不給*,帶上-r選項也可以匹配)

--exclude-from = FILE:在文件中編寫通配方案,grep將不會到匹配方案中文件名的文件去查找匹配內容

--exclude-dir = DIR:匹配一個目錄下的很多內容同時還要讓一些子目錄不接受匹配,就使用此選項。

 --include = GLOB:僅搜索其基本名稱與GLOB匹配的文件(使用--exclude下所述的通配符匹配)。

-R ,-r :以遞歸方式讀取每個目錄下的所有文件; 這相當於-d recurse選項。

其他選項:

--line-buffered: 在輸出上使用行緩衝。這可能會導致性能損失。

--mmap:啓用mmap系統調用代替read系統調用

-U:將文件視爲二進制。

-z:將輸入視爲一組行,每一行由一個零字節(ASCII NUL字符)而不是a終止新隊。與-Z或--null選項一樣,此選項可以與排序-z等命令一起使用來處理任意文件名。

3. grep練習

# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
或
# cat /etc/passwd | grep root 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

# grep -n root /etc/passwd   #顯示行號
1:root:x:0:0:root:/root:/bin/bash
30:operator:x:11:0:operator:/root:/sbin/nologin

# grep -n root --color=auto /etc/passwd   #顯示行號;顯示高亮
1:root:x:0:0:root:/root:/bin/bash
30:operator:x:11:0:operator:/root:/sbin/nologin

# grep -v root /etc/passwd   #取反(沒有root的行)
backup:x:1000:1000::/home/backup:/bin/bash
mysql:x:1001:1002::/home/mysql:/bin/bash

# grep -i root /etc/passwd   #不區分大小寫
backup:x:1000:1000::/home/backup:/bin/bash
mysql:x:1001:1002::/home/mysql:/bin/bash

# cat passwd.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

# grep -A 2 daemon  passwd.txt   #向含有daemon的下取2行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

# grep -B 2 daemon  passwd.txt  #向含有daemon的上取2行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

# grep -C 2 daemon  passwd.txt   #向含有daemon的上下各取2行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

# grep 'root' *           #在當前目錄搜索帶'root'行的文件
# grep -r 'root' *        #在當前目錄及其子目錄下搜索'rooot'行的文件
# grep -l -r 'root' *     #在當前目錄及其子目錄下搜索'root'行的文件,但是不顯示匹配的行,只顯示匹配的文件

4. egrep正則

基本曾則:優點(兼容性強,缺點(繁瑣))
拓展:優點(簡單),缺點:(兼容性弱)
egrep:grep -E
練習:

 grep '^r' /etc/passwd----'^id' /etc/inittab----------'^HOSTNAME' /etc/sysconfig/network
 grep 'localhost$' /etc/hosts                      #匹配以某字符結尾的內容
grep '^root\|^daemon' /etc/passwd                   #(基本)多條件顯示內容
 egrep '^root|^daemon' /etc/passwd                  #(擴展)多條件顯示內容
grep -q '^192.168.4.4' /etc/hosts && echo "YES" || echo "NO"    #選項 -q 表示 quiet(靜默)的意思,結合此選項可以只做檢索而並不輸出,通常在腳本內用來識別查找的目標是否存在,通過返回狀態 $? 來判斷,這樣可以忽略無關的文本信息
egrep  '/sbin/nologin$' /etc/passwd  ///確認是否正確      #統計本地用戶中登錄Shell爲“/sbin/nologin”的用戶個數
egrep -c '/sbin/nologin$' /etc/passwd              #統計個數
egrep '/bin/bash$' /etc/passwd | wc -l             #統計個數
egrep '.' /etc/rc.local                            #顯示非空行的內容
egrep -v '.' /etc/rc.local                         #顯示空行
egrep '^$' /etc/rc.local                            #顯示空行
egrep 'f+' /etc/rc.loca                         #至少出現一次
egrep 'init(ial)?' /etc/rc.local                 #匹配出現init,initab的行
egrep 'stuf*' /etc/rc.local                     #匹配stuf後面出現任意次數的行
egrep '^r.*nologin$' /etc/passwd                 #.*匹配任意多個字符的行(首,尾之間)
元字符 {} —— 限定出現的次數範圍
egrep '(ab){3}' brace.txt                        #匹配ab出現3次的行
egrep '(ab){2,4}' brace.txt                      #匹配ab出現2,4次的行
egrep '(ab){3,}' brace.txt                       #匹配ab至少出現3次的行
元字符 [] —— 匹配範圍內的單個字符
egrep 'ab[cd]' brace.txt
egrep '[A-Z]' brace.tx
egrep '[^ a-zA-Z]' brace.txt
單詞邊界匹配
egrep '\binit\b' /etc/rc.local                  #同
egrep '\<init\>' /etc/rc.local                  #同
egrep 'll\>' /etc/rc.local
egrep 'll\b' /etc/rc.local
多個條件的組合
egrep '\<IDE\>|\<CDROM\>' /var/log/dmesg         #通過dmesg啓動日誌查看與IDE接口、CDROM光盤相關的設備信息
egrep -i 'eth|network|bluetooth' /var/log/dmesg      #通過dmesg啓動日誌查看藍牙設備、網卡設備相關的信息
利用正則表達式完成檢索任務
egrep -c ".*" /etc/httpd/conf/httpd.conf      #總行數
egrep -c "#" /etc/httpd/conf/httpd.conf       #顯示註釋行數
egrep -c "^$" /etc/httpd/conf/httpd.con        #顯示空行數
egrep -c -v '#|^$'  /etc/httpd/conf/httpd.conf  #顯示除掉空行與註釋行的行數

匹配MAC地址、郵箱地址、IP地址
echo $MAC01 | egrep -q '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}' && echo "有效" || echo "無效"                       #檢查MAC地址是否有效
匹配郵箱地址格式:用戶名與域名之間以 @ 分隔 
用戶名不少於3個字符,可能由字母、下劃線、句點 . 、數字組成 
域名應至少有一個 . 分隔,分隔的各部分至少2個字符,可能由字母、減號、數字組成 
[0-9a-zA-Z_.]{3,}@[0-9a-zA-Z.-]{2,}(\.[0-9a-zA-Z-]{2,})+
 egrep '[0-9a-zA-Z_.]{3,}@\ [0-9a-zA-Z.-]{2,}(\.[0-9a-zA-Z-]{2,})+' mailadd.txt   #匹配有效郵箱地址
匹配主機名格式:由 . 分隔,至少包括3組字符串
每組字符串不少於2個字符,可能由字母、減號、數字、下劃線組成 
主機名後必須是單詞邊界,主機名前不能有@符號 
^[^@][0-9a-zA-Z_-]{2,}(\.[0-9a-zA-Z_-]{2,}){2,}\>
egrep '^[^@][0-9a-zA-Z_-]{2,}(\.[0-9a-zA-Z_-]{2,}){2,}\>'  mailadd.txt     #匹配有效主機名
匹配IP地址
以 . 分隔,一共由四組十進制數構成 
每組數值的範圍爲0-255,字符寬度爲1-3位 
前後必須是單詞邊界 
\<[0-9]{1,3}(\.[0-9]{1,3}){3}\>
 ifconfig | egrep '\<[0-9]{1,3}(\.[0-9]{1,3}){3}\>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章