1. 程式人生 > >grep命令、find命令

grep命令、find命令

@Author  : Spinach | GHB
@Link    : http://blog.csdn.net/bocai8058

find命令

find命令,又稱檔案查詢命令。在一個目錄(及子目錄)中搜索檔案,你可以指定一些匹配條件,如按檔名、檔案型別、使用者甚至是時間戳查詢檔案。

// find命令的一般形式為:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression] 
// find命令的常用形式可以簡化為:
find [path...] [expression]
// path:find命令所查詢的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄
// expression:expression可以分為——“-options [-print -exec -ok ...]”
       
-options:指定find命令的常用選項。
[options]主要引數:
    -c:只輸出匹配行的計數。
    -i:不區分大小寫
    -h:查詢多檔案時不顯示檔名。
    -l:查詢多檔案時只輸出包含匹配字元的檔名。
    -n:顯示匹配行及行號。
    -s:不顯示不存在或無匹配文字的錯誤資訊。
    -v:顯示不包含匹配文字的所有行。
    
-print:find命令將匹配的檔案輸出到標準輸出

-exec:find命令對匹配的檔案執行該引數所給出的shell命令。
       相應命令的形式為'command' {  } \;,注意{   }和\;之間的空格
       i. find ./ -size 0 -exec rm {} \; 刪除檔案大小為零的檔案 (還可以以這樣做:rm -i `find ./ -size 0`  或 find ./ -size 0 | xargs rm -f &) 
      ii. 為了用ls -l命令列出所匹配到的檔案,可以把ls -l命令放在find命令的-exec選項中:find . -type f -exec ls -l {  } \; 
     iii. 在/logs目錄中查詢更改時間在5日以前的檔案並刪除它們:find /logs -type f -mtime +5 -exec rm {  } \;

-ok:和-exec的作用相同,只不過以一種更為安全的模式來執行該引數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓使用者來確定是否執行。 
     i. find . -name "*.conf"  -mtime +5 -ok rm {  } \; 在當前目錄中查詢所有檔名以.LOG結尾、更改時間在5日以上的檔案,並刪除它們,只不過在刪除之前先給出提示

find命令常用選項及例項

-name : 按照檔名查詢檔案。

// 在/dir目錄及其子目錄下面查詢名字為filename的檔案
$ find /dir -name filename

// 在當前目錄及其子目錄(用“.”表示)中查詢任何副檔名為“c”的檔案 
$ find . -name "*.c" 

-perm:按照檔案許可權來查詢檔案。

// 在當前目錄下查詢檔案許可權位為755的檔案,即檔案屬主可以讀、寫、執行,其他使用者可以讀、執行的檔案
$ find . -perm 755 –print 

-prune:使用這一選項可以使find命令不在當前指定的目錄中查詢,如果同時使用-depth選項,那麼-prune將被find命令忽略。

// 在apps目錄下查詢檔案,但不希望在/apps/bin目錄下查詢
$ find /apps -path "/apps/bin" -prune -o –print 

// 在/usr/sam目錄下查詢不在dir1子目錄之內的所有檔案
$ find /usr/sam -path "/usr/sam/dir1" -prune -o –print 

-user:按照檔案屬主來查詢檔案。

// 在$HOME目錄中查詢檔案屬主為sam的檔案
$ find ~ -user sam –print 

-group:按照檔案所屬的組來查詢檔案。

// 在/apps目錄下查詢屬於gem使用者組的檔案
$ find /apps -group gem –print 

-mtime -n +n:按照檔案的更改時間來查詢檔案, - n表示檔案更改時間距現在n天以內,+ n表示檔案更改時間距現在n天以前。

// 在系統根目錄下查詢更改時間在5日以內的檔案
$ find / -mtime -5 –print

// 在/var/adm目錄下查詢更改時間在3日以前的檔案
$ find /var/adm -mtime +3 –print

-nogroup:查詢無有效所屬組的檔案,即該檔案所屬的組在/etc/groups中不存在。

$ find / –nogroup -print

-nouser:查詢無有效屬主的檔案,即該檔案的屬主在/etc/passwd中不存在。

$ find /home -nouser –print

-newer file1 ! file2:查詢更改時間比檔案file1新但比檔案file2舊的檔案。 -type:查詢某一型別的檔案,諸如:

b - 塊裝置檔案。 
d - 目錄。 
c - 字元裝置檔案。 
p - 管道檔案。 
l - 符號連結檔案。 
f - 普通檔案。

$ find /etc -type d –print // 在/etc目錄下查詢所有的目錄
$ find . ! -type d –print // 在當前目錄下查詢除目錄以外的所有型別的檔案
$ find /etc -type l –print // 在/etc目錄下查詢所有的符號連結檔案

-size n:[c] 查詢檔案長度為n塊的檔案,帶有c時表示檔案長度以位元組計。

// 在當前目錄下查詢檔案長度大於 1M 位元組的檔案
$ find . -size +1000000c –print 

// 在/home/apache目錄下查詢檔案長度恰好為100位元組的檔案
$ find /home/apache -size 100c –print 

// 在當前目錄下查詢長度超過10塊的檔案(一塊等於512位元組)
$ find . -size +10 –print 

-depth:在查詢檔案時,首先查詢當前目錄中的檔案,然後再在其子目錄中查詢。

// 它將首先匹配所有的檔案然後再進入子目錄中查詢 
$find / -name "CON.FILE" -depth –print

-mount:在查詢檔案時不跨越檔案系統mount點。

// 從當前目錄開始查詢位於本檔案系統中檔名以XC結尾的檔案(不進入其他檔案系統) 
$ find . -name "*.XC" -mount –print

-type d:查詢資料夾

// 從當前目錄開始查詢資料夾名為test的資料夾
$ find . -name "test" -type d

其他

find / -amin -10   # 查詢在系統中最後10分鐘訪問的檔案(access time)
find / -atime -2   # 查詢在系統中最後48小時訪問的檔案
find / -empty   # 查詢在系統中為空的檔案或者資料夾
find / -group cat   # 查詢在系統中屬於 group為cat的檔案
find / -mmin -5   # 查詢在系統中最後5分鐘裡修改過的檔案(modify time)
find / -mtime -1   #查詢在系統中最後24小時裡修改過的檔案
find / -user fred   #查詢在系統中屬於fred這個使用者的檔案
find / -size +10000c  #查找出大於10000000位元組的檔案(c:位元組,w:雙字,k:KB,M:MB,G:GB)
find / -size -1000k   #查找出小於1000KB的檔案

使用混合查詢方式查詢檔案

# 引數有: !,-and(-a),-or(-o)。
find /tmp -size +10000c -and -mtime +2  #在/tmp目錄下查詢大於10000位元組並在最後2分鐘內修改的檔案
find / -user fred -or -user george  #在/目錄下查詢使用者是fred或者george的檔案檔案
find /tmp ! -user panda  #在/tmp目錄中查詢所有不屬於panda使用者的檔案

find與xargs結合

在使用find命令的-exec選項處理匹配到的檔案時, find命令將所有匹配到的檔案一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令執行幾分鐘之後,就會出現溢位錯誤。錯誤資訊通常是“引數列太長”或“引數列溢位”。這就是xargs命令的用處所在,特別是與find命令一起使用。

find命令把匹配到的檔案傳遞給xargs命令,而xargs命令每次只獲取一部分檔案而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分檔案,然後是下一批,並如此繼續下去。

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

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

來看看xargs命令是如何同find命令一起使用的,並給出一些例子。

// 查詢系統中的每一個普通檔案,然後使用xargs命令來測試它們分別屬於哪類檔案
$ find . -type f -print | xargs file 

// 在整個系統中查詢記憶體資訊轉儲檔案(core dump) ,然後把結果儲存到/tmp/core.log 檔案中
$ find / -name "core" -print | xargs echo "" >/tmp/core.log

// 用grep命令在所有的普通檔案中搜索hostname這個詞
$ find . -type f -print | xargs grep "hostname"

// 刪除3天以前的所有東西 (find . -ctime +3 -exec rm -rf {} \;)
$ find ./ -mtime +3 -print|xargs rm -f –r

// 刪除檔案大小為零的檔案
$ find ./ -size 0 | xargs rm -f &

grep命令

grep(global search regular expression(RE) and print out the line,全面搜尋正則表示式並把行打印出來)命令,又稱檔案內容查詢命令,是一種強大的文字搜尋工具,它能使用正則表示式搜尋文字,並把匹配的行打印出來。。

grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

[options]主要引數:
    -c:只輸出匹配行的計數。
    -i:不區分大小寫
    -h:查詢多檔案時不顯示檔名。
    -l:查詢多檔案時只輸出包含匹配字元的檔名。
    -n:顯示匹配行及行號。
    -s:不顯示不存在或無匹配文字的錯誤資訊。
    -v:顯示不包含匹配文字的所有行。

pattern正則表示式主要引數:
    \: 忽略正則表示式中特殊字元的原有含義。
    ^:匹配正則表示式的開始行。
    $: 匹配正則表示式的結束行。
    \<:從匹配正則表示式的行開始。
    \>:到匹配正則表示式的行結束。
    [ ]:單個字元,如[A]即A符合要求 。
    [ - ]:範圍,如[A-Z],即A、B、C一直到Z都符合要求 。
    .:所有的單個字元。
    * :有字元,長度可以為0。

grep命令用於搜尋由Pattern引數指定的模式,並將每個匹配的行寫入標準輸出中。這些模式是具有限定的正則表示式,它們使用ed或egrep命令樣式。如果在File引數中指定了多個名稱,grep命令將顯示包含匹配行的檔案的名稱。

grep命令的一般選項及例項

// 通過管道過濾ls -l輸出的內容,只顯示以a開頭的行。
$ ls -l | grep '^a' 

// 顯示所有以d開頭的檔案中包含test的行。
$ grep 'test' d* 

// 顯示在aa,bb,cc檔案中匹配test的行。
$ grep 'test' aa bb cc 

// 顯示所有包含每個字串至少有5個連續小寫字元的字串的行。
$ grep '[a-z]\{5\}' aa 

// 如果west被匹配,則es就被儲存到記憶體中,並標記為1,然後搜尋任意個字元(.*),這些字元後面緊跟著另外一個es(),找到就顯示該行。
// 如果用egrep或grep -E,就不用""號進行轉義,直接寫成'w(es)t.*'就可以了。
$ grep 'w(es)t.*' aa 

// 不區分大小寫地搜尋。預設情況區分大小寫。
$ grep -i pattern files 

// 只列出匹配的檔名。
$ grep -l pattern files 

// 列出不匹配的檔名。
$ grep -L pattern files 

// 只匹配整個單詞,而不是字串的一部分(如匹配‘magic’,而不是‘magical’)。
$ grep -w pattern files 

// 匹配的上下文分別顯示[number]行。
$ grep -C number pattern files 

// 顯示匹配pattern1或pattern2的行。
$ grep pattern1 | pattern2 files 

// 顯示既匹配pattern1又匹配pattern2的行。
$ grep pattern1 files | grep pattern2