天天看點

Linux多檔案查找工具之grep

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>&amp;&gt; </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 &lt;http:</code><code>//gnu</code><code>.org</code><code>/licenses/gpl</code><code>.html&gt;</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. =&gt; grr | gr

'?' 比對次數有1次或0次 如: gr? =&gt; gr | g

'*' 比對次數任意次數 如: gr* =&gt; grrrrrr | g | gr

'+' 比對次數至少1次 如: gr+ =&gt; gr | grrr

'{n}' 比對多少次(确定) 如 gr{2} =&gt; grrr

'{n,}' 比對至少n次以上 如 gr{2,} =&gt; grrr | grrrrr

'{,m}' 比對至多m次以内 如 gr{,2} =&gt; g | grr

'{n,m}' 比對次數在n到m次之間 如gr{2,3} =&gt; grrr | grrrr

(b) 元字元集(基于POSIX,在使用時需要加入[])

'[:alnum:]' 比對數字和字元中的一個 例 [0-9A-Za-z]

'[:alpha:]' 比對基本字元串 例 [A-Za-z]

'[:black:]' 比對一個制表符和空格符,tab,space鍵所産生的空格

'[:digit:]' 比對一個數字 例 [0-9]

'[:punct:]' 比對一個在半角狀态下符号 例 [!"#$%&amp;()*+,-./:;&lt;=&gt;?@[\]^_'{|}~`]

'[:graph:]' 比對一個[:punct:]和[:alnum:]中的任意一個字元

'[:space:]' 比對一個space空格字元

'[:print:]' 比對一個[:punct:]和[:alnum:]和[:space:]中一個字元

'[:lower:]' 比對一個[a-z]中的任意一個字元

'[:upper:]' 比對一個[A-Z]中的任意一個字元

'[:xdigit:]' 比對一個[0-9a-fA-F]中的任一個字元

(c) 特殊表達式

'\b' 比對字元串時進行完全限定 例: word\b =&gt; word 而不限定的話 wor. =&gt; work

'\&lt;' 比對字元串時進行左邊限定

'\&gt;' 比對字元串是進行右邊限定  例 \bword\b

=&gt; \&lt;word\&gt;

'\w' 比對[:alnum:]中外加'_'的任意一個字元

'\s' 比對[:space:]比對空格字元串

'()' 将比對規則看作一個整體出現,不可分割

例 ab*(cc)d* =&gt; acc | abccd | abbcc | accdddd

'|'  将比對規則或處理,注意或者包括前後整體 ab|cd =&gt; ab | cd

(4) 錨标記

'^' 行首錨定也代表正則比對規則開始 例 ^g... =&gt; geek | gank

'$' 行尾錨定也代表正則比對規則結束 例 ...k$ =&gt; seek | work

(5) 後項引用

'\n' 與小括号聯用,如果目前規則中出現小括号,則在後續的規則中可以進行引用替換,替換

的值需要完全比對 例 (g..k)\1 =&gt; 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:]-./?%&amp;=]*\)\?$</code>

<code># http://www.baidu.com</code>

<code># http://51buy.com</code>

解析 : URL可以由http或者https開頭,并且s是可選的,接下來//,斜線需要轉義,是以出現了

\/\/.然後是任意字母字元可以加-,但必須有1位,是以{1,},接下來出現.号,期間重複出現,

最後可以出現.?=&amp;這些符号,通常是網頁參數

<code>http:</code><code>//blog</code><code>.51cto.com</code><code>/user_index</code><code>.php?action=addblog_new&amp;job=modify&amp;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,如需轉載請自行聯系原作者

繼續閱讀