天天看點

RHEL6基礎之八查找、檔案内容檢視類指令

find--在某個指定的路徑下查找需要的檔案或目錄

格式:

find [查找位置] [查找标準] [處理動作]

查找位置:預設為目前目錄,可以指定多個目錄,多個之間用空格

查找标準:預設為查找指定目錄下的所有檔案

處理動作:顯示到标準輸出,預設為print

查找标準

以檔案名查找

-name "檔案名稱" : 根據檔案名查找,支援glob(檔案名通配),注意檔案名需用雙引号

1

2

3

4

5

6

7

<code>[root@localhost ~]</code><code># find /etc/ -name "ifcfg-eth0"</code>

<code>/etc/sysconfig/network-scripts/ifcfg-eth0</code>

<code>[root@localhost ~]</code><code># find /etc/ -name "ifcfg*"</code>

<code>/etc/sysconfig/network-scripts/ifcfg-lo</code>

<code>/etc/sysconfig/network-scripts/ifcfg-eth0bak</code>

<code>[root@localhost ~]</code><code>#</code>

-iname "檔案名稱",根據檔案名查找,不區分大小寫

<code>[root@localhost ~]</code><code># mkdir Justin juStin jusTin</code>

<code>[root@localhost ~]</code><code># find -iname "justin"</code>

<code>.</code><code>/juStin</code>

<code>.</code><code>/jusTin</code>

<code>.</code><code>/Justin</code>

以檔案的屬性查找

-user "USERNAME" ----根據屬主查找

-group "GROUP" --- 根據屬組查找

-uid "UID" ---根據UID查找

-gid "GID" ---根據GID查找

-nouser--- 查找沒有屬主的檔案

-nogroup--- 查找沒有屬組的檔案

<code>#在/dev目錄下查找使用者名為root組為disk的檔案并用長格式顯示</code>

<code>[root@localhost ~]</code><code># find /dev/ -user root -a -group disk -ls</code>

<code> </code><code>10630    0 crw-rw----   1 root     disk              9月 24 10:18 </code><code>/dev/sg0</code>

<code> </code><code>10241    0 brw-rw----   1 root     disk              9月 24 10:18 </code><code>/dev/ram3</code>

<code>  </code><code>9915    0 brw-rw----   1 root     disk              9月 24  2013 </code><code>/dev/ram1</code>

多條件查找連接配接符

-a: 與

-o: 或

-not、!:非

<code>[root@localhost home]</code><code># ls</code>

<code>111.txt  222.log  justin  justin1  justin2</code>

<code>[root@localhost home]</code><code># find /home/ -name "*.txt" -o -name "*.log"</code>

<code>/home/222</code><code>.log</code>

<code>/home/111</code><code>.txt</code>

<code>[root@localhost home]</code><code># find /home/ -name "*.txt" -a -name "*.log"</code>

以檔案類型查找

-type 檔案類型

檔案類型指的是普通檔案(f)、目錄(d)、塊裝置檔案(b)、字元裝置檔案(c)、符号連結檔案(l)、指令管道檔案(p)、套接字檔案(s)等

<code>[root@localhost ~]</code><code># find /bin/ -type l</code>

<code>/bin/mail</code>

<code>/bin/rview</code>

<code>/bin/ex</code>

<code>/bin/gtar</code>

以檔案大小查找

-size”大小條件

一般使用“+”、“-”号設定超過或小于指定的大小作為查找條件。常用的容量機關包括k(注意是小寫)、M、G。

8

9

10

11

12

13

<code>[root@localhost ~]</code><code># find /root/ -size 2k        ;大小為2K的檔案</code>

<code>/root/</code><code>.gconf</code><code>/apps/brasero/config/priority/</code><code>%gconf.xml</code>

<code>/root/</code><code>.gconf</code><code>/desktop/gnome/accessibility/keyboard/</code><code>%gconf.xml</code>

<code>/root/</code><code>.gnote</code><code>/89099c13-c354-48d6-89ce-0415b1db3c78</code><code>.note</code>

<code>/root/</code><code>.gnote</code><code>/db520e7c-3433-4433-b35a-3ad9a14e16d4</code><code>.note</code>

<code>/root/anaconda-ks</code><code>.cfg</code>

<code>[root@localhost ~]</code><code># find /root/ -size +50k   ;大小超過50k的檔案</code>

<code>/root/</code><code>.cache</code><code>/ibus/pinyin/user-1</code><code>.3.db</code>

<code>/root/</code><code>.cache</code><code>/ibus/bus/registry</code><code>.xml</code>

<code>/root/</code><code>.pulse</code><code>/8665cfcff9c76f94fac16e0000000022-device-volumes</code><code>.tdb</code>

<code>/root/</code><code>.gstreamer-0.10</code><code>/registry</code><code>.i386.bin</code>

<code>/root/</code><code>.gconfd</code><code>/saved_state</code>

-empty 空檔案(目錄)

<code>[root@localhost ~]</code><code># find -empty /</code>

-maxdepth 限制find指令在目錄中按照遞減方式查找檔案的時候搜尋檔案超過某個級别或者搜尋過多的目錄

<code>[root@localhost ~]</code><code># find . -maxdepth 2 -name fred</code>

假如這個fred檔案在./sub1/fred目錄中,那麼這個指令就會直接定位這個檔案,查找很容易成功。假如,這個檔案在./sub1/sub2/fred目錄中,那麼這個指令就無法查找到。因為前面已經給find指令在目錄中最大的查詢目錄級别為2,隻能查找2層目錄下的檔案。這樣做的目的就是為了讓find指令更加精确的定位檔案,如果你已經知道了某個檔案大概所在的檔案目錄級數,那麼加入-maxdepth n 就很快的能在指定目錄中查找成功。

以檔案修改時間查找

-atime [+|-]# : access time通路時間,預設為天,#表示#天的這個時間點,+#表示至少有#天沒通路, -#表示#天之内有通路

-mtime [+|-]# : modify time修改時間,#表示#天的這個時間點沒有被修改,+#表示至少有#天沒有修改 , -#表示#天之内有修改

-ctime [+|-]# : change time改變時間,#表示#天的這個時間點沒有被改變,+#表示至少有#天沒有被改變 , -#表示#天之内有被改變

mtime和ctime的差別在于,隻有修改了檔案的内容,才會更新檔案的mtime,而對檔案更名,修改檔案的屬主等操作,隻會更新ctime。舉例說明: 對檔案進行mv操作,mtime不變,ctime更新;編輯檔案内容,mtime和ctime同時修改。

-amin [+|-]# :時間為分鐘,#表示#分鐘的這個時間點沒有被通路,+#表示至少有#分鐘沒有被通路 , -#表示#分鐘之内通路

-mmin [+|-]# :時間為分鐘,#表示#分鐘的這個時間點沒有被修改,+#表示至少有#分鐘沒有被修改 , -#表示#分鐘之内有被修改

-cmin [+|-]# :時間為分鐘,#表示#分鐘的這個時間點沒有被改變,+#表示至少有#分鐘沒有被改變 , -#表示#分鐘之内有被改變

<code>[root@localhost logs]</code><code># find /opt/queryweb/logs -mtime +7 -type f -name "*.log" -exec rm -f {} \;</code>

<code>[root@localhost logs]</code><code>#</code>

以檔案權限查找

-perm [+|-] MODE

 不帶[+|-]表示精确權限比對,

 +表示任何一類使用者的任何一位權限比對

 - 表示每類使用者的每位權限都比對

14

15

<code>#精确比對/etc下權限為755的檔案。ugo都必須同時滿足</code>

<code>[root@localhost ~]</code><code># find /etc/ -perm 755 -ls |more</code>

<code>622593   16 drwxr-xr-x  98 root     root        12288 Aug  6 14:39 </code><code>/etc/</code>

<code>622778    8 drwxr-xr-x   2 root     root         4096 Jan 12  2007 </code><code>/etc/jvm</code>

<code>622638    8 drwxr-xr-x   2 root     root         4096 Aug  2 16:44 </code><code>/etc/xinetd</code><code>.d</code>

<code>#755用二進制表示為111 101 101;+後跟權限比對原則是滿足所有權限位的一個位就可以</code>

<code>[root@localhost ~]</code><code># find /etc/ -perm +755 -ls |more</code>

<code>622625    8 -rw-r--r--   1 root     root          135 Aug  6 13:31 </code><code>/etc/printcap</code>

<code>622645   20 -rw-r--r--   1 root     root        14100 Sep  5  2006 </code><code>/etc/mime</code><code>.types</code>

<code>#-後跟權限比對原則是ugo中所有位權限必須同時滿足,屬主必須為rwx,屬組和other至少為rw</code>

<code>[root@localhost ~]</code><code># find /etc/ -perm -755 -ls |more</code>

處理動作

-print---find指令将比對的檔案輸出到标準輸出。

-exec---對比對的檔案執行該參數所給出的shell指令。相應指令的形式為'command' {} \;,注意{}和\;之間的空格,同時兩個{}之間沒有空格

-ok---和-exec的作用相同,隻不過以一種更為安全的模式來執行該參數所給出的shell指令,在執行每一個指令之前,都會給出提示,讓使用者來确定是否執行。

<code># 在目前目錄下查找除目錄以外的所有類型的檔案 ,并列印出來</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># find . ! -type d –print</code>

<code>#查找root目錄下的以log結尾的檔案,将其複制到test目錄下。</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># find /root –name “*log” –type f –exec cp {} /root/test/ \; 2&gt;/dev/null</code>

<code>#通過-exec參數指定後面要執行的指令,{}表示将查找到的内容全部複制,\;表示指令的結束,2&gt;/dev/null是指将執行查找過程中出現的錯誤資訊重定向到黑洞檔案中,也就是不顯示那些錯誤資訊。</code>

<code>#長格式顯示test下的普通檔案</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># find . -type f -exec ls -l {  } \;</code>

<code>#***test下大小為0的檔案</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># find ./ -size 0 -exec rm {} \;</code>

<code>#在目前目錄中查找所有檔案名以.conf結尾、更改時間在5日以上的檔案,并***它們,隻不過在***之前先給出提示</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># find . -name "*.conf"  -mtime +5 -ok rm {  } \;</code>

/dev/zero主要的用處是用來建立一個指定長度用于初始化的空檔案,就像臨時交換檔案。

 在使用find指令的-exec選項處理比對到的檔案時, find指令将所有比對到的檔案一起傳遞給exec執行。但有些系統對能夠傳遞給exec的指令長度有限制,這樣在find指令運作幾分鐘之後,就會出現溢出錯誤。錯誤資訊通常是“參數列太長”或“參數列溢出”。find指令把比對到的檔案傳遞給xargs指令,而xargs指令每次隻擷取一部分檔案而不是全部,這樣它可以先處理最先擷取的一部分檔案,然後是下一批,并如此繼續下去。

在有些系統中,使用-exec選項會為處理每一個比對到的檔案而發起一個相應的程序,并非将比對到的檔案全部作為參數一次執行;這樣在有些情況下就會出現程序過多,系統性能下降的問題,因而效率不高;

而使用xargs指令則隻有一個程序。另外,在使用xargs指令時,究竟是一次擷取所有的參數,還是分批取得參數,以及每一次擷取參數的數目都會根據該指令的選項及系統核心中相應的可調參數來确定。

<code>#查找系統中的每一個普通檔案,然後使用xargs指令來測試它們分别屬于哪類檔案[root@localhost ~]# find . -type f -print | xargs file</code>

<code>#在整個系統中查找記憶體資訊轉儲檔案(core dump) ,然後把結果儲存到/tmp/core.log 檔案中:</code>

<code>[root@localhost ~]</code><code># find / -name "core" -print | xargs echo "" &gt;/tmp/core.log</code>

<code>#用grep指令在所有的普通檔案中搜尋hostname這個詞</code>

<code>[root@localhost ~]</code><code># find . -type f -print | xargs grep "hostname"</code>

<code>#***3天以前的所有東西 (find . -ctime +3 -exec rm -rf {} \;)</code>

<code>[root@localhost ~]</code><code># find ./ -mtime +3 -print|xargs rm -f –r</code>

<code>#***檔案大小為零的檔案</code>

<code>[root@localhost ~]</code><code># find ./ -size 0 | xargs rm -f &amp;</code>

xargs指令是給其他指令傳遞參數的一個過濾器,也是組合多個指令的一個工具。它擅長将标準輸入資料轉換成指令行參數,預設從管道傳來的值是放在最後的

xargs能夠處理管道或者stdin并将其轉換成特定指令的指令參數。xargs是建構單行指令的重要元件之一。

xargs也可以将單行或多行文本輸入轉換為其他格式,例如多行變單行,單行變多行。xargs的預設指令是echo,空格是預設定界符。這意味着通過管道傳遞給xargs的輸入将會包含換行和空白,不過通過xargs的處理,換行和空白将被空格取代。xargs是建構單行指令的重要元件之一。如下:

<code>[root@localhost ~]</code><code># cat xargs.txt </code>

<code>1 2 3 4</code>

<code>a b c d</code>

<code>A B C D</code>

<code>a1 b2 c3 d4</code>

<code>A1 B2 C3 D4</code>

<code>[root@localhost ~]</code><code># cat xargs.txt | xargs</code>

<code>1 2 3 4 a b c d A B C D a1 b2 c3 d4 A1 B2 C3 D4</code>

    -0 當sdtin含有特殊字元時候,将其當成一般字元,像/'空格等

    -a file 從檔案中讀入作為sdtin

<code>1 1 1 1</code>

<code>2 2</code>

<code>3 3 3 </code>

<code>4 4 4 4</code>

<code>5 5 5 5</code>

<code>[root@localhost ~]</code><code># xargs -a xargs.txt </code>

<code>1 1 1 1 2 2 3 3 3 4 4 4 4 5 5 5 5</code>

    -e flag ,注意有的時候可能會是-E,flag必須是一個以空格分隔的标志,當xargs分析到含有flag這個标志的時候就停止。

<code>[root@localhost ~]</code><code># cat xargs.txt |xargs -E "3" echo</code>

<code>1 1 1 1 2 2</code>

   -p 操作具有可互動性,每次執行comand都互動式提示使用者選擇

<code>[root@localhost ~]</code><code># cat xargs.txt |xargs -p echo</code>

<code>echo</code> <code>1 1 1 1 2 2 3 3 3 4 4 4 4 5 5 5 5 ?...y</code>

    -n xargs 的-n選項設定每次送給command指令的參數個數,參數以空白字元或&lt;newline&gt;換行符分割

<code>[root@localhost ~]</code><code># cat xargs.txt |xargs -n 3  echo</code>

<code>1 1 1</code>

<code>1 2 2</code>

<code>3 3 3</code>

<code>4 4 4</code>

<code>4 5 5</code>

<code>5 5</code>

    -t 啟用指令行輸出模式:其先回顯要運作的指令,然後執行指令,列印出指令結果,跟蹤與調試xargs的利器,也是研究xargs運作原理的好辦法;

    -i -i 選項告訴 xargs 可以使用{}代替傳遞過來的參數, 建議使用-I,其符合POSIX标準

   -I  格式: xargs -I rep-str comand rep-srt rep-str 為代替傳遞給xargs參數, 可以使 {} $ @ 等符号 ,其主要作用是當xargs command 後有多個參數時,調整參數位置。eg:find . -name "*.txt " |xargs -I {} cp {} /tmp ;預設管道會将find的結果傳遞給cp做為最後的參數,通過-I來指定起傳遞過來參數的未知

    -r 如果沒有要處理的參數傳遞給xargsxargs 預設是帶 空參數運作一次,如果你希望無參數時,停止 xargs,直接退出,使用 -r 選項即可,其可以防止xargs 後面指令帶空參數運作報錯。If the standard input does not contain any nonblanks, do not run the command, exit

    -s size 設定每次構造Command行的長度總大小,包括 command +init-param +傳遞參數,Size 參數必須是正整數

    -L  num Use at most max-lines nonblank input lines per command line.-s是含有空格的。

    -l  同-L

    -d delim 分隔符,預設的xargs分隔符是回車,argument的分隔符是空格,這裡修改的是xargs的分隔符

<code>[root@localhost ~]</code><code># echo "51ctox51ctox51cto"|xargs -dx</code>

<code>51cto 51cto 51cto</code>

<code>[root@localhost ~]</code><code># echo "51ctox51ctox51cto"|xargs -n1 -dx</code>

<code>51cto</code>

    -x exit的意思,主要是配合-s使用。

    -P 修改最大的程序數,預設是1,為0時候為as many as it can ,這個例子我沒有想到,應該平時都用不到的吧。

查找并顯示檔案

找到某個檔案是我們的目的,我們更想知道查找到的檔案的詳細資訊和屬性,如果我們采取現查找檔案,在使用LS指令來檢視檔案資訊是相當繁瑣的,現在我們也可以把這兩個指令結合起來使用。

<code>[root@localhost ~]</code><code># find / -name "httpd.conf" -ls </code>

<code>12063 34 -rw-r--r-- 1 root root 33545 Dec 30 15:36 </code><code>/etc/httpd/conf/httpd</code><code>.conf</code>

find指令配合使用exec和xargs可以使使用者對所比對到的檔案執行幾乎所有的指令。

which---查找外部指令所對應的程式檔案

<code>[root@localhost ~]</code><code># which ls</code>

<code>alias</code> <code>ls</code><code>=</code><code>'ls --color=auto'</code>

<code>    </code><code>/bin/ls</code>

<code>[root@localhost ~]</code><code># which pwd</code>

<code>/bin/pwd</code>

<code>[root@localhost ~]</code><code># which cd</code>

<code>/usr/bin/which</code><code>: no </code><code>cd</code> <code>in</code> <code>(</code><code>/usr/lib/qt-3</code><code>.3</code><code>/bin</code><code>:</code><code>/usr/local/sbin</code><code>:</code><code>/usr/local/bin</code><code>:</code><code>/sbin</code><code>:</code><code>/bin</code><code>:</code><code>/usr/sbin</code><code>:</code><code>/usr/bin</code><code>:</code><code>/root/bin</code><code>)</code>

說明:which指令用于查找Linux外部指令所對應的程式檔案,其搜尋範圍由環境變量PATH決定,在PATH變量指定的路徑中,搜尋某個系統指令的位置,并且傳回第一個搜尋結果。也就是說,使用which指令,就可以看到某個系統指令是否存在,以及執行的到底是哪一個位置的指令,執行指令後,首先顯示出系統中所設定指令的别名,然後是指令的程式檔案如“/bin/ls”。如果要查找的是一個内部指令,那将找不到任何對應的程式檔案如cd。

whereis---查找檔案或目錄

-b---隻找二進制文檔

-m---隻查找manual路徑下的檔案

-s---隻查找source下的

-u---查找以上三個找不到的檔案檔案

<code>[root@localhost ~]</code><code># whereis pwd</code>

<code>pwd</code><code>: </code><code>/bin/pwd</code> <code>/usr/share/man/man1/pwd</code><code>.1.gz </code><code>/usr/share/man/man1p/pwd</code><code>.1p.gz</code>

<code>[root@localhost ~]</code><code># whereis etc</code>

<code>etc: </code><code>/usr/local/etc</code>

<code>[root@localhost ~]</code><code># whereis -b pwd</code>

<code>pwd</code><code>: </code><code>/bin/pwd</code>

<code>[root@localhost ~]</code><code># whereis -m pwd</code>

<code>pwd</code><code>: </code><code>/usr/share/man/man1/pwd</code><code>.1.gz </code><code>/usr/share/man/man1p/pwd</code><code>.1p.gz</code>

<code>[root@localhost ~]</code><code># whereis -s pwd</code>

<code>pwd</code><code>:</code>

<code>[root@localhost ~]</code><code># whereis -u pwd</code>

說明:隻能用于程式名的搜尋,而且隻搜尋二進制檔案(參數-b)、man說明檔案(參數-m)和源代碼檔案(參數-s),如果省略參數,則傳回所有資訊

locate---查找檔案

<code>#查找/etc下pass開頭的檔案</code>

<code>[root@localhost ~]</code><code># locate /etc/pass</code>

<code>/etc/passwd</code>

<code>/etc/passwd-</code>

說明:locate指令其實是“find -name”的另一種寫法,但是要比後者快得多,原因在于它不搜尋具體目錄,而是搜尋一個資料庫(/var/lib/locatedb),這個資料庫中含有本地所有檔案資訊。Linux系統自動建立這個資料庫,并且每天自動更新一次,是以使用locate指令查不到最新變動過的檔案。為了避免這種情況,可以在使用locate之前,先使用updatedb指令,手動更新資料庫

grep---Global Regular Expression Print全局搜尋正規表達式并将結果列印出來---在檔案中查找并顯示包含指定字元串的行,目标是字元串

格式:grep [參數] 查找條件 目标檔案

功能說明:grep指令是一種強大的文本搜尋工具,是一個對行進行搜尋的操作,它能使用正規表達式搜尋文本,用于查找内容包含指定的範本樣式的檔案,如果發現某檔案的内容符合所指定的範本樣式,預設grep指令會把含有範本樣式的那一行顯示出來。若不指定任何檔案名稱,或是所給予的檔案名為“-”,則grep指令會從标準輸入裝置讀取資料。

Unix的grep家族包括grep、egrep和fgrep。 egrep表示擴充的grep,相比grep支援更多的元字元(元字元就是指那些在正規表達式中具有特殊意義的專用字元),"grep -E"相當于egrep。fgrep是fast grep,不支援元字元,但是搜尋速度更快。grep搜尋的結果被送到螢幕,不影響原檔案内容。

grep搜尋建議:

比對字元串、調用變量時建議使用雙引号:grep "ZOO_INFO" zookeeper.log   g r e p“$ M Y VA R” zookeeper.log

正則比對應使用單引号:grep ‘\&lt;ZOO_INFO\&gt;’ zookeeper.log

--color=auto 比對的關鍵用顔色顯示出來

<a href="http://blog.51cto.com/attachment/201312/152250430.png" target="_blank"></a>

如果每次使用 grep 都得要自行加上 --color=auto 需要在 ~/.bashrc 内加上這行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』來立即生效即可

<a href="http://blog.51cto.com/attachment/201312/152428115.png" target="_blank"></a>

<code>[root@justin ~]</code><code># source /root/.bashrc</code>

-v---反向查找,即輸出與查找條件不相符的行

<a href="http://blog.51cto.com/attachment/201309/133324769.png" target="_blank"></a>

-i或--ignore-case---忽略字元大小寫的差别

<code>[root@localhost home]</code><code># echo "a" &gt; i</code>

<code>[root@localhost home]</code><code># echo "A" &gt;&gt; i</code>

<code>[root@localhost home]</code><code># cat i</code>

<code>a</code>

<code>A</code>

<code>[root@localhost home]</code><code># grep "a" i</code>

<code>[root@localhost home]</code><code># grep -i "a" i</code>

<code>[root@localhost home]</code><code>#</code>

-E---多個字元串一起搜尋,就是egrep

<code>[root@justin ~]</code><code># cat /etc/samba/smb.conf |egrep -v '#|;'</code>

過濾掉#号和;号的行

-A&lt;顯示行數n&gt;或--after-context=&lt;顯示行數n&gt; 除了顯示符合範本樣式的那一列之外,并顯示該行之後n行的内容。

<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -A 2 title</code>

<code>title Red Hat Enterprise Linux (2.6.32-279.el6.i686)</code>

<code>    </code><code>root (hd0,0)</code>

<code>    </code><code>kernel </code><code>/vmlinuz-2</code><code>.6.32-279.el6.i686 ro root=UUID=31d213fb-c46d-4b1d-9300-f43c0c7afb94 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet</code>

<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep title</code>

-B&lt;顯示行數n&gt;或--before-context=&lt;顯示行數n&gt; 除了顯示符合範本樣式的那一行之外,并顯示該行之前n行内容

<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -B 2 title</code>

<code>splashimage=(hd0,0)</code><code>/grub/splash</code><code>.xpm.gz</code>

<code>hiddenmenu</code>

-C&lt;顯示行數n&gt;或--context=&lt;顯示行數n&gt;或-&lt;顯示行數n&gt; 除了顯示符合範本樣式的那一行之外,并顯示該行之前後n行的内容。

<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -C 2 title</code>

-c或--count 計算符合範本樣式行數。

16

17

18

19

20

21

<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -c 2.6.32</code>

<code>3</code>

<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf</code>

<code># grub.conf generated by anaconda</code>

<code>#</code>

<code># Note that you do not have to rerun grub after making changes to this file</code>

<code># NOTICE:  You have a /boot partition.  This means that</code>

<code>#          all kernel and initrd paths are relative to /boot/, eg.</code>

<code>#          root (hd0,0)</code>

<code>#          kernel /vmlinuz-version ro root=/dev/sda2</code>

<code>#          initrd /initrd-[generic-]version.img</code>

<code>#boot=/dev/sda</code>

<code>default=0</code>

<code>timeout=5</code>

<code>    </code><code>initrd </code><code>/initramfs-2</code><code>.6.32-279.el6.i686.img</code>

-r或--recursive 遞歸的搜尋

當要隻知道要查找的字元串大緻的目錄位置不清除具體路徑,通過遞歸搜尋查找到

-L:輸出時隻顯示不包含比對項的檔案名。

-l ----隻顯示比對字元串的檔案名不顯示比對的行,通常和-r 一起使用

<code>[root@justin ~]</code><code># mkdir -p /home/grep/{grep1,grep2}</code>

<code>[root@justin ~]</code><code># touch /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># echo "1 2 3" &gt; /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># touch /home/grep/grep1/1.txt</code>

<code>[root@justin ~]</code><code># echo "a b c" &gt; /home/grep/grep1/1.txt</code>

<code>[root@justin ~]</code><code># grep "a" /home/grep/</code>

<code>[root@justin ~]</code><code># grep "a" -r /home/grep/</code>

<code>/home/grep/grep1/1</code><code>.txt:a b c</code>

<code>[root@justin ~]</code><code># grep "a" -rl /home/grep/</code>

<code>/home/grep/grep1/1</code><code>.txt</code>

<code>[root@justin ~]</code><code>#</code>

-n或--line-number---在顯示符合範本樣式的那一行之前,标示出該列的行數編号

<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -n title</code>

<code>14:title Red Hat Enterprise Linux (2.6.32-279.el6.i686)</code>

-o:隻顯示被模式比對到的字元串,而不是整個行

<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -no title</code>

<code>14:title</code>

-h:輸出時每行行首不顯示檔案名

。-H:輸出時每行行首顯示檔案名。

-w, –word-regexp:精确比對,比對單詞還不是字元串,如想比對“justin”,”justin_peng”就不會被比對

\&lt;: 單詞錨定詞首,例如\&lt;r..t 那麼root、rooter均可以比對,而chroot就不能比對

\&gt;: 單詞錨定詞尾,例如r..t\&gt; 那麼root、chroot均可比對,而chroot就不能比對,如果要錨定root 可以使用\&lt;root\&gt;

<code>[root@justin home]</code><code># cat grep.txt </code>

<code>justin</code>

<code>justin_peng</code>

<code>[root@justin home]</code><code># grep "justin" grep.txt </code>

<code>[root@justin home]</code><code># grep -w "justin" grep.txt </code>

<code>[root@justin home]</code><code>#</code>

-R, -r, –recursive:遞歸搜尋, 查找你搜尋的目錄或子目錄下的所有含有某個你要找的檔案.

<code>[root@justin </code><code>grep</code><code>]</code><code># grep "justin" /home/</code>

<code>[root@justin </code><code>grep</code><code>]</code><code># grep -R "justin" /home/</code>

<code>/home/grep/grep</code><code>.txt:justin</code>

<code>/home/grep</code><code>.txt:justin</code>

<code>/home/grep</code><code>.txt:justin_peng</code>

<code>[root@justin </code><code>grep</code><code>]</code><code>#</code>

正則比對:

符号”[]“表示比對指定範圍内的任意單個字元,'passw[Oo]rd'匹password和passwOrd

<code>[root@justin ~]</code><code># echo "password" &gt; /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># echo "passwOrd" &gt;&gt; /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># grep -nr 'passw[oO]rd' /home/grep/</code>

<code>/home/grep/grep1/a</code><code>.txt:1:password</code>

<code>/home/grep/grep1/a</code><code>.txt:2:passwOrd</code>

[] 裡面不論有幾個位元組,他都謹一個一個位元組的比對,也就是隻會比對password和passwOrd,而不會比對passwoOrd,在一組集合位元組中,如果該位元組組是連續的,例如大寫英文/小寫英文/數字等等, 就可以使用[a-z],[A-Z],[0-9],[a-zA-Z]等方式來書寫

如果要比對空格,最好用空格的[:space:]來比對,如果直接用空格來比對那麼tab産生的空格是不會比對的

<code>[root@justin ~]</code><code># grep '[[:space:]]' grep.txt</code>

[[:alpha:]] 代表英文大小寫字母 a-z A-Z

[[:upper:]] :表示大寫字母[A-Z]

[[:alnum:]]: 所有的字母和數字

[[:blank:]] [[:space:]] 代表空格鍵與 [Tab] 按鍵兩者

[[:digit:]] :表示數字 [0-9]

符号"[^]"表示比對指定範圍之外的任意單個字元,如:'[^a-fA-F]oo'比對不包含A-F和a-f的一個字母開頭,緊跟oo的行。

<code>[root@justin ~]</code><code># echo "Google" &gt; /home/grep/grep1/1.txt</code>

<code>[root@justin ~]</code><code># echo "google" &gt;&gt; /home/grep/grep1/1.txt</code>

<code>[root@justin ~]</code><code># echo "Foogle" &gt;&gt; /home/grep/grep1/1.txt</code>

<code>[root@justin ~]</code><code># echo "foogle" &gt;&gt; /home/grep/grep1/1.txt</code>

<code>[root@justin ~]</code><code># cat /home/grep/grep1/1.txt</code>

<code>Google</code>

<code>google</code>

<code>Foogle</code>

<code>foogle</code>

<code>[root@justin ~]</code><code># grep '[^a-fA-F]oo' /home/grep/grep1/1.txt</code>

符号“^”表示以什麼字元開頭,“^word”表示以“word”開頭,如果word前面有空格時需要使用[:space:]來比對前面的空格[root@Zabbix_server home]# grep '^[[:space:]]*root' punct.txt

符号“$”表示以什麼字元結尾,“word$”表示以“word”結尾。如果word後面有符号比對時候需要使用[:punct:]來比對後的符号[root@Zabbix_server home]# grep 'root[[:punct:]]*$' punct.txt 表示比對punct.txt檔案中以root單詞結尾後面接任意多個符号的行

比對行尾為小數點(.)因為小數點具有其他意義(底下會介紹),是以必須要使用轉義字元(\)來加以解除其特殊意義,轉義為一個普通字元!

<code>[root@justin ~]</code><code># grep '.$' /home/grep/grep1/a.txt</code>

<code>grep</code>

<code>grap</code>

<code>grbp</code>

<code>grabp</code>

<code>grcbp</code>

<code>grcbp.</code>

<code>[root@justin ~]</code><code># grep '\.' /home/grep/grep1/a.txt</code>

小數點”.“表示任意一個非換行符的字元,'gr.p'比對gr後接一個任意字元,然後是p

<code>[root@justin ~]</code><code># echo "grep" &gt; /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># echo "grap" &gt;&gt; /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># echo "grbp" &gt;&gt; /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># echo "grabp" &gt;&gt; /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># echo "grcbp" &gt;&gt; /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># grep 'gr.p' /home/grep/grep1/a.txt</code>

星号“*”:基本正規表達式中表示比對其前的字元出現0次或任意次數,例如ab*c,那麼ac、abc、acc都會比對,而abdc就不比對,星号在基本正規表達式裡隻指次數,*不會比對隐藏檔案。隻表示次數,不表示任意字元

擴充正規表達式中多以下元字元:

+ 比對一個或多個前面的字元.它的作用和*很相似,但唯一的差別是它不比對零個字 符的情況,如果要指定範圍使用{n,m}來指定,如查找一位或2位數值的行:

<code>[root@Zabbix_server ~]</code><code># egrep --color=auto '\&lt;[0-9]{1,3}[[:space:]]' /proc/meminfo </code>

<code>[root@Zabbix_server ~]</code><code># egrep --color=auto '\&lt;[0-9]{3}[[:space:]]' /proc/meminfo </code>

<code>[root@Zabbix_server ~]</code><code># egrep --color=auto '\&lt;[0-9]+[[:space:]]' /proc/meminfo</code>

| 表示或關系

例如egrep 'abc|def' /proc/meminfo  查找abc或者def

分組

例如 egrep 'abc|def' /proc/meminfo  查找abc或者def

       egrep 'ab(c|d)ef' /proc/meminfo  查找abcef或者abdef      

<code>[root@Zabbix_server home]</code><code># egrep 'abc|def' 12.txt --color=auto</code>

<code>abc</code>

<code>abcdef</code>

<code>abcef</code>

<code>abdef</code>

<code>[root@Zabbix_server home]</code><code># egrep 'ab(c|d)ef' 12.txt --color=auto</code>

<code>[root@Zabbix_server home]</code><code>#</code>

問号“?”:基本正規表達式中表示比對其前的字元出現0次或1次數。隻做次數比對,不做字元比對

<code>[root@justin ~]</code><code># echo "google" &gt; /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># echo "goooooooooooooogle" &gt;&gt; /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># grep 'g..gle' /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># grep 'g*gle' /home/grep/grep1/a.txt</code>

<code>goooooooooooooogle</code>

<code>[root@justin ~]</code><code># grep 'g.gle' /home/grep/grep1/a.txt</code>

如果想查找兩個字元之間任意個字元的條件,可以通過小數點和星号一起來比對,如查找前尾分别為gr和g的行

<code>[root@justin ~]</code><code># grep 'gr.*g' /home/grep/grep1/a.txt</code>

字元範圍\{m,n \}:限制前一個字元重複出現最少m次,最多n次數

因為 { 與 } 的符号在 shell 是有特殊意義的,是以必須要使用字元   \ 來讓他失去特殊意義

\{m,\} 表示至少m次,

\{0,n\} 表示最多n次,不能使用\{,n\}

\{m\}   表示隻出現m次

() 将候選的所有元素放在()内,用|隔開

        "a(1|2|3)bc"滿足的例子a1bc、mba3bcd

如果要以組的形式比對,例如xaby 要比對ab組合出現多次可以使用\(\)來比對,例如x\(ab\)*y,表示xy中間中ab出現0次或n次

前向引用

<code>[root@Zabbix_server home]</code><code># cat 1.txt </code>

<code>He love his lover.</code>

<code>She like her liker.</code>

<code>He love his liker.</code>

<code>She like her lover.</code>

例如要比對love和lover、like和liker同時所在行

<code>[root@Zabbix_server home]</code><code># grep '\(l..e\).*\1r' 1.txt </code>

這裡\1表示比對第一個左括号内l..e相同的内容,\(l\(..\)e\).*\2r表示比對\(..\)這個内..相同的内容,以此類推

查找出現兩個o的行:

<code>[root@justin ~]</code><code># cat /home/grep/grep1/a.txt</code>

<code>"Open Source"</code> <code>is a good mechanism to develop programs.</code>

<code>apple is my favorite food.</code>

<code>Football game is not use feet only.</code>

<code>Oh! The soup taste good.</code>

<code>google is the best tools </code><code>for</code> <code>search ke</code>

<code>goooooogle </code><code>yes</code><code>!</code>

<code>[root@justin ~]</code><code># grep 'o\{2\}' /home/grep/grep1/a.txt</code>

查找g後面出現2到5次o,然後緊跟g的行:

<code>[root@justin ~]</code><code># grep 'go\{2,5\}g' /home/grep/grep1/a.txt</code>

查找g後面出現兩次以上o後面跟g的行:

<code>[root@justin ~]</code><code># grep 'go\{2,\}g' /home/grep/grep1/a.txt</code>

<code>[root@justin ~]</code><code># grep 'go*g' /home/grep/grep1/a.txt</code>

字元類

代表意義

[:alnum:]

代表英文大小寫字元及數字,即0-9,A-Z,a-z

[:alpha:]

代表任何英文大小字元,即A-Z,a-z

[:lower:]

代表小寫字元,即a-z

[:upper:]

代表大寫字元,即A-Z

[:digit:]

代表數字,即0-9

[:xdigit:]

代表十六進制的數字類型,是以包括0-9,A-F,a-f的數字與字元

[:blank:]

代表空格鍵與tab按鍵

[:graph:]

除了空格與tab按鍵之外的其它所有按鍵

[:space:]

任何會産生空白的字元,包括空格鍵,Tab鍵,CR等

[:cntrl:]

代表鍵盤上面的控制按鍵,既包括CR,LF,Tab,Del等

[:print:]

代表任意可列印字元

[:punct:]

代表标點符号,即" ' ? ! ; : # $

cat

cat隻适合檢視内容較短的檔案,無法上翻頁,隻能顯示、檢視一屏内容

tac同上,隻是倒叙顯示内容

<code>[root@justin home]</code><code># cat test</code>

<code>111</code>

<code>222</code>

<code>333</code>

<code>[root@justin home]</code><code># tac test</code>

more

more适合檢視長檔案,可以上、下翻頁,按空格鍵下翻一頁,按Enter下翻一行,按b上翻一頁,cat和more可以配合使用

<code>[root@justin log]</code><code># more boot.log</code>

<code>[root@justin log]</code><code># cat boot.log |more</code>

less

less使用檢視長檔案,而且可以搜尋【關鍵詞】,按N/n查找前後關鍵字

<code>[root@justin log]</code><code># less secure</code>

<code>Jan 22 10:58:30 justin sshd[1716]: Server listening on :: port 22.</code>

<code>Jan 22 10:59:12 justin sshd[1901]: Accepted password </code><code>for</code> <code>root from 10.15.72.73 port 60959 ssh2</code>

<code>Jan 22 10:59:13 justin sshd[1901]: pam_unix(sshd:session): session opened </code><code>for</code> <code>user root by (uid=0)</code>

<code>Jan 22 10:59:13 justin sshd[1901]: subsystem request </code><code>for</code> <code>sftp</code>

<code>/port</code> <code>22</code>

head

檢視檔案頭N行資料,預設頭10,通過-n指定檢視行數;

<code>[root@justin log]</code><code># head -n 2 secure</code>

<code>Nov 13 17:31:16 localhost sshd[1582]: Server listening on 0.0.0.0 port 22.</code>

<code>Nov 13 17:31:16 localhost sshd[1582]: Server listening on :: port 22.</code>

<code>[root@justin log]</code><code>#</code>

tail

檢視檔案末尾n行,用法同上;參數-f動态實時

<code>[root@justin log]</code><code># tail -n 2 secure -f</code>

<code>[root@justin log]</code><code># tail -fn 2 secure</code>

<code></code>

本文轉自 justin_peng 51CTO部落格,原文連結:http://blog.51cto.com/ityunwei2017/1301078,如需轉載請自行聯系原作者