1. 簡介
grep全稱Global Regular Expression Print,全局正規表達式列印.
在這裡面提到了三個關鍵詞,我們逐個進行分析,這樣有助于我們了解
grep這個指令的作用,1.global說明該指令可以用于所有使用者(互動式
使用者) 2.Regular Expression的作用想必學過基本程式的同學都知道
Regular Expression最大的作用就是按照規則(模式)去查找比對的一
段字元串,至于如何按照規則這是後面 3.Print 按照規則搜尋的的字
符串當然要列印出來了,不然這是在瞎耽誤功夫
綜合而論,在多個使用者模式下,根據規則搜尋查找想要的文本片段,将
其标準輸出在互動行(當然可以重定向輸出)
2. 文法
Usage:
1
<code>grep</code> <code>[OPTION]... PATTERN [FILE]...</code>
eg:
2
<code>[root@CentOS ~]</code><code># grep -e "^root" /etc/passwd</code>
<code> </code><code>root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>
3
4
5
6
<code>dd</code> <code>if</code><code>=</code><code>/dev/zero</code> <code>of=</code><code>/dev/sdb</code> <code>bs=1M count=612</code>
<code>returnVal=$?</code>
<code>if</code> <code>[ $returnVal -</code><code>eq</code> <code>0 ]; </code><code>then</code>
<code> </code><code>echo</code> <code>-e </code><code>'n\np\n1\n \n+100M\nn\np\n2\n \n+512M\nw'</code> <code>| </code><code>fdisk</code>
<code>/dev/sdb</code> <code>&> </code><code>/dev/null</code>
<code>fi</code>
(a)基本程式資訊
'--help' 幫助資訊
<code>grep</code> <code>--help</code>
'-V'
'--version' 程式版本資訊及版權資訊
<code>[root@CentOS ~]</code><code># grep -V</code>
<code>GNU </code><code>grep</code> <code>2.6.3</code>
<code>Copyright (C) 2009 Free Software Foundation, Inc.</code>
<code>License GPLv3+: GNU GPL version 3 or later <http:</code><code>//gnu</code><code>.org</code><code>/licenses/gpl</code><code>.html></code>
<code>This is </code><code>free</code> <code>software: you are </code><code>free</code> <code>to change and redistribute it.</code>
<code>There is NO WARRANTY, to the extent permitted by law.</code>
(b) 比對控制選項
'-e pattern' 預設選項,表明grep工具使用正則比對規則搜尋資料
<code>[root@CentOS ~]</code><code># grep -e "/bin/bash" /etc/passwd</code>
<code>root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>
'-i' 忽略比對的大小寫結果
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -i "ssh" /etc/passwd</code>
<code>sshd:x:74:74:Privilege-separated SSH:</code><code>/var/empty/sshd</code><code>:</code><code>/sbin/nologin</code>
'-v' 将比對結果反轉
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -iv "ssh" /etc/passwd</code>
<code>bin:x:1:1:bin:</code><code>/bin</code><code>:</code><code>/sbin/nologin</code>
<code>...</code>
'-w' 單詞比對(行中隻要出現該比對資訊即可傳回結果)
<code># 示例程式</code>
<code>cpuid level :13</code>
<code>wp : </code><code>yes</code>
<code>wp</code>
<code>wpp</code>
<code>flags</code>
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -w "wp" b.txt</code>
<code>wp : </code><code>yes</code>
'-x' 行比對(行中隻出現該比對資訊才傳回資訊)
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -x "wp" b.txt</code>
(c) 通用輸出選項
'-c' 比對正規表達式成功次數
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -c 'root' /etc/passwd</code>
<code>2</code>
'--color' 比對結果高亮辨別 {never | always | auto}
<code>grep</code> <code>--color=auto </code><code>'root'</code> <code>/etc/passwd</code>
'-m #' 比對傳回次數
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -m 1 'root' /etc/passwd</code>
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -m 2 'root' /etc/passwd</code>
<code>operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>
'-o' 比對正規表達式所比對的内容(grep預設情況傳回比對資料的所在行)
7
8
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep 'root' /etc/passwd</code>
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -o 'root' /etc/passwd</code>
<code>root</code>
'-q' 安靜模式,比對内容沒有任何輸出
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -q 'root' /etc/passwd</code>
<code>[root@CentOS </code><code>test</code><code>]</code><code>#</code>
(d) 輸出行字首選項
'-b' 位元組偏移列印(需要注意該辨別隻是每行塊首的位置)
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -b 'root' /etc/passwd</code>
<code>0:root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>
<code>388:operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>
'-H' 比對内容所在檔案字首顯示(多檔案自動開啟)
9
10
11
12
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -H 'root' /etc/passwd</code>
<code>/etc/passwd</code><code>:root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>
<code>/etc/passwd</code><code>:operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep 'root' /etc/passwd ./a.txt</code>
<code>.</code><code>/a</code><code>.txt:root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>
<code>.</code><code>/a</code><code>.txt:operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>
'-n' 比對内容所在檔案的行号
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -n 'root' /etc/passwd</code>
<code>1:root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>
<code>11:operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>
'-T' 對齊字首内容,更加美觀友善識别
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -bnH 'root' /etc/passwd</code>
<code>/etc/passwd</code><code>:1:0:root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>
<code>/etc/passwd</code><code>:11:388:operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -bnHT 'root' /etc/passwd</code>
<code>/etc/passwd</code><code>: 1: 0:root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>
<code>/etc/passwd</code><code>: 11: 388:operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>
'-l' 隻輸出比對内容所在的檔案名(多檔案查找,隻需要知道存在性時)
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -l 'root' /etc/passwd ./a.txt ./b.txt</code>
<code>/etc/passwd</code>
<code>.</code><code>/a</code><code>.txt</code>
'-L' 輸出不比對内容的文名(一般情況下linux參數大小寫都是擷取相反的結果)
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -L 'root' /etc/passwd ./a.txt ./b.txt</code>
<code>.</code><code>/b</code><code>.txt</code>
'-s' 不顯示關于不存在或者無法讀取檔案的錯誤資訊。
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep 'root' /etc/passwd1</code>
<code>grep</code><code>: </code><code>/etc/passwd1</code><code>: No such </code><code>file</code> <code>or directory</code>
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -s 'root' /etc/passwd1</code>
(e) 内容行選項
'-A #' 比對内容的之後#行資訊
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -A 1 'root' /etc/passwd</code>
<code>--</code>
<code>games:x:12:100:games:</code><code>/usr/games</code><code>:</code><code>/sbin/nologin</code>
'-B #' 比對内容的之前#行資訊(第一個比對項就是第一行)
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -B 2 'root' /etc/passwd</code>
<code>mail:x:8:12:mail:</code><code>/var/spool/mail</code><code>:</code><code>/sbin/nologin</code>
<code>uucp:x:10:14:uucp:</code><code>/var/spool/uucp</code><code>:</code><code>/sbin/nologin</code>
'-C #' 比對内容的前後各#行資訊
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -C 1 'root' /etc/passwd</code>
'--group-separator=string' 當使用到-A,-B,-C時中間可能出現内容分割符,此指令可以替
換中間預設的'--'的分隔符
<code>[root@CentOS </code><code>test</code><code>]</code><code># grep -C 1 --group-separator=### 'root'</code>
<code>###</code>
'--no-group-separator' 不顯示分隔符,這個就不示例了 :)
(f) 檔案及檔案夾選項
'-a' 如果需要操作的檔案是二進制檔案,此指令會将理論可能轉換的文字進行比對
<code>[root@CentOS ~]</code><code># grep "file" /bin/grep</code>
<code>Binary </code><code>file</code> <code>/bin/grep</code> <code>matches</code>
<code>[root@CentOS ~]</code><code># grep -a "file" /bin/grep</code>
<code> </code><code>write error(standard input)lseek failedBinary </code><code>file</code> <code>%s matches</code>
<code>/usr/share/localeGREP_OPTIONSreadskipunknown</code> <code>devices methodrecurseunknown directories methodinvalid max countbinaryunknown binary-files typeyesforcenevernononeautoif-ttyTERMdumbGREP_COLORGREP_COLORSGNU </code><code>grep</code> <code>2.6.3%s</code>
'-r' 如果指定查找對象是一個目錄,那麼需要使用遞歸完成所有檔案比對
<code>[root@CentOS ~]</code><code># grep "file" ./test</code>
<code>[root@CentOS ~]</code><code># grep -r "file" ./test</code>
<code>Binary </code><code>file</code> <code>.</code><code>/test/grep</code> <code>matches</code>
<code>.</code><code>/test/a</code><code>.txt:custom </code><code>file</code>
<code>.</code><code>/test/a</code><code>.txt:</code><code>file</code> <code>custom</code>
<code>[root@CentOS ~]</code><code>#</code>
'-D' 如果查找的檔案中包括裝置輸入輸出,套接字檔案的時候,可以選擇其他操作{read,
skip},當然如果使用-r或-R周遊時此選項沒有效果
'-d' 如果查找的檔案是一個目錄時,也可以選擇其他操作{read,skip}
(g) 其他選項
'--line-buffered' 輸出時使用緩存區,這樣的好處不言而明 :)
3. grep正規表達式字元集
grep在查詢與搜尋内容時是支援正規表達式的,很難想象有哪一種作業系統或開發語言
不支援它的,不論是IT運維還是程式員都需要掌握的一種基本技能.當然如果系統管理者
掌握這些之後,可以非常友善的對于系統進行管理與操作,綜上所述,學好正規表達式是
學好grep指令的重中之重.接下來我們先接觸基本的比對字元集,由簡到繁
(a) 基本集
'.' 比對一個非換行符的字元 如: gr. => grr | gr
'?' 比對次數有1次或0次 如: gr? => gr | g
'*' 比對次數任意次數 如: gr* => grrrrrr | g | gr
'+' 比對次數至少1次 如: gr+ => gr | grrr
'{n}' 比對多少次(确定) 如 gr{2} => grrr
'{n,}' 比對至少n次以上 如 gr{2,} => grrr | grrrrr
'{,m}' 比對至多m次以内 如 gr{,2} => g | grr
'{n,m}' 比對次數在n到m次之間 如gr{2,3} => grrr | grrrr
(b) 元字元集(基于POSIX,在使用時需要加入[])
'[:alnum:]' 比對數字和字元中的一個 例 [0-9A-Za-z]
'[:alpha:]' 比對基本字元串 例 [A-Za-z]
'[:black:]' 比對一個制表符和空格符,tab,space鍵所産生的空格
'[:digit:]' 比對一個數字 例 [0-9]
'[:punct:]' 比對一個在半角狀态下符号 例 [!"#$%&()*+,-./:;<=>?@[\]^_'{|}~`]
'[:graph:]' 比對一個[:punct:]和[:alnum:]中的任意一個字元
'[:space:]' 比對一個space空格字元
'[:print:]' 比對一個[:punct:]和[:alnum:]和[:space:]中一個字元
'[:lower:]' 比對一個[a-z]中的任意一個字元
'[:upper:]' 比對一個[A-Z]中的任意一個字元
'[:xdigit:]' 比對一個[0-9a-fA-F]中的任一個字元
(c) 特殊表達式
'\b' 比對字元串時進行完全限定 例: word\b => word 而不限定的話 wor. => work
'\<' 比對字元串時進行左邊限定
'\>' 比對字元串是進行右邊限定 例 \bword\b
=> \<word\>
'\w' 比對[:alnum:]中外加'_'的任意一個字元
'\s' 比對[:space:]比對空格字元串
'()' 将比對規則看作一個整體出現,不可分割
例 ab*(cc)d* => acc | abccd | abbcc | accdddd
'|' 将比對規則或處理,注意或者包括前後整體 ab|cd => ab | cd
(4) 錨标記
'^' 行首錨定也代表正則比對規則開始 例 ^g... => geek | gank
'$' 行尾錨定也代表正則比對規則結束 例 ...k$ => seek | work
(5) 後項引用
'\n' 與小括号聯用,如果目前規則中出現小括号,則在後續的規則中可以進行引用替換,替換
的值需要完全比對 例 (g..k)\1 => geekgeek | geakgeak
4. 實戰
(a) QQ号碼
<code>^[1-9]*[1-9][0-9]*$</code>
解析 : QQ号碼的開頭(^)不能是0,是以是[1-9],[1-9]的可以是任意位*,允許有1位數的QQ
當然你也可以限定QQ号碼的位數
<code>^[1-9][[:digit:]]{5-14}$</code>
(b) URL位址
<code>^http[s]\?:\/\/\([[:alnum:]-]{1,}\.\){1,}[[:alnum:]-]{1,}\([[:alnum:]-./?%&=]*\)\?$</code>
<code># http://www.baidu.com</code>
<code># http://51buy.com</code>
解析 : URL可以由http或者https開頭,并且s是可選的,接下來//,斜線需要轉義,是以出現了
\/\/.然後是任意字母字元可以加-,但必須有1位,是以{1,},接下來出現.号,期間重複出現,
最後可以出現.?=&這些符号,通常是網頁參數
<code>http:</code><code>//blog</code><code>.51cto.com</code><code>/user_index</code><code>.php?action=addblog_new&job=modify&tid=1360494</code>
(c) IP位址
<code>\(25[0-5]\|2[0-4][[:digit:]]\|[1][[:digit:]]\{2\}\|[1-9]\?[[:digit:]]\)\.</code>
<code>\(25[0-5]\|2[0-4][[:digit:]]\|[1][[:digit:]]\{2\}\|[1-9]\?[[:digit:]]\)</code>
<code>127.0.0.1</code>
<code>255.255.255.0</code>
解析 : 猛然一看,可能這個比較難,當我們仔細觀察會發現很多都是重複内容,ip位址的比對
由高位到低位開始,我們先來轉換一下這個正則,25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|[1-
9][0-9]|[0-9],這段的意思是說如果ip位址是25開頭的3位數字的話,位址可以是250,251,252
253,254,255,接下來就是2開頭的其他三位數的比對,範圍可以是2[0-4][0-9],需要注意它們
之間的關系是或者,那麼25[0-5]\|2[0-4][[:digit:]]這段我們就可以把200-255這段
ip位址列完,接下來的事情就是在1開頭的三位數與二位數繼續判斷.
本文轉自My_King1 51CTO部落格,原文連結:http://blog.51cto.com/apprentice/1360494,如需轉載請自行聯系原作者