Linux之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 

引用:https://www.cnblogs.com/hongdada/p/8922682.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章