一.find命令用於:在一個目錄(及子目錄)中搜尋檔案,你可以指定一些匹配條件,如按檔案名稱、檔案類型、使用者甚至是時間戳記尋找檔案。
find命令的常用形式為:find [path...] [expression]
path:指定要尋找的路徑
expression:可以分為“-options [-print -exec -ok ...]”
-print:把匹配的檔案輸出
-type:尋找指定類型檔案,後面常用選項有:
b - 塊裝置檔案。
d - 目錄。
c - 字元裝置檔案。
p - 管道檔案。
l - 符號連結檔案。
f - 普通檔案。
-exec:對匹配到的檔案執行exec後面的shell命令,相應命令的形式為'command' { } \; 。注意:{ } 和\;之間的空格
執行個體:刪除目前的目錄下所有以exe結尾的檔案:
lc@lc-Lenovo:~/work/test$ lsbss.exe data.exe main.clc@lc-Lenovo:~/work/test$ find ./ -name "*.exe" -exec rm {} \;lc@lc-Lenovo:~/work/test$ lsmain.clc@lc-Lenovo:~/work/test$
執行個體:尋找目前的目錄下目錄檔案:
lc@lc-Lenovo:~/work/test$ lsdir1 dir2 main.clc@lc-Lenovo:~/work/test$ find ./ -type d -print././dir2./dir1
lc@lc-Lenovo:~/work/test$ find -name "dir*" -type d -print./dir2./dir1
-name:按照檔案名稱尋找
-mtime:按照時間尋找
-ok,和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓使用者來確定是否執行。
執行個體:尋找刪除目前的目錄下以.txt結尾的更改時間在一天以內的檔案
lc@lc-Lenovo:~/work/test$ lsdir1 dir2 main.c test1.txt test2.txtlc@lc-Lenovo:~/work/test$ find -name "*.txt" -mtime -1 -ok rm {} \;< rm ... ./test1.txt > ? y< rm ... ./test2.txt > ? ylc@lc-Lenovo:~/work/test$ lsdir1 dir2 main.clc@lc-Lenovo:~/work/test$
-size:按照檔案大小尋找
執行個體:尋找刪除目前的目錄下空檔案
lc@lc-Lenovo:~/work/test$ ls -ll總用量 12drwxrwxr-x 2 lc lc 4096 8月 16 10:48 dir1drwxrwxr-x 2 lc lc 4096 8月 16 10:48 dir2-rw-rw-r-- 1 lc lc 0 8月 16 11:01 file1-rw-rw-r-- 1 lc lc 0 8月 16 11:06 file2-rw-rw-r-- 1 lc lc 124 8月 16 09:08 main.clc@lc-Lenovo:~/work/test$ find ./ -size 0 -exec rm {} \;lc@lc-Lenovo:~/work/test$ lsdir1 dir2 main.clc@lc-Lenovo:~/work/test$
xagrs:
使用-exec處理尋找到的檔案的時候,把所有匹配檔案一起傳遞給-exec有些系統對傳遞給exec的參數長度有限制這樣在find命令運行幾分鐘之後,就會出現溢出錯誤。錯誤資訊通常是“參數列太長”或“參數列溢出”。find命令把匹配到的檔案傳遞給xargs命令,而xargs命令每次只擷取一部分檔案,這樣它可以先處理最先擷取的一部分檔案,然後是下一批,並如此繼續下去。
在有些系統中,使用-exec選項會為處理每一個匹配到的檔案而發起一個相應的進程,並非將匹配到的檔案全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統效能下降的問題,因而效率不高;而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次擷取所有的參數,還是分批取得參數,以及每一次擷取參數的數目都會根據該命令的選項及系統核心中相應的可調參數來確定。
執行個體:查看目前的目錄下普通檔案格式
lc@lc-Lenovo:~/work/test$ lsdir1 dir2 main.clc@lc-Lenovo:~/work/test$ find . -type f -print |xargs file./main.c: C source, ASCII text./dir1/main.c: emptylc@lc-Lenovo:~/work/test$
二.grep命令:全面搜尋Regex並輸出結果。
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
grep命令用於搜尋由Pattern參數指定的模式,並將每個匹配的行寫入標準輸出中。這些模式是具有限定的Regex,它們使用ed或egrep命令樣式。如果在File參數中指定了多個名稱,grep命令將顯示包含匹配行的檔案的名稱。對
shell 有特殊含義的字元 ($, *, [, |, ^, (, ), \ ) 出現在 Pattern參數中時必須帶雙引號。如果 Pattern參數不是簡單字串,通常必須用單引號將整個模式括起來。在諸如 [a-z], 之類的運算式中,-(減號)cml 可根據當前正在整理的序列來指定一個範圍。整理序列可以定義等價的類以供在字元範圍中使用。如果未指定任何檔案,grep會假定為標準輸入。
^ 錨定行的開始 如:'^grep'匹配所有以grep開頭的行。
$ 錨定行的結束 如:'grep$'匹配所有以grep結尾的行。
. 匹配一個非分行符號的字元 如:'gr.p'匹配gr後接一個任一字元,然後是p。
* 匹配零個或多個先前字元 如:' *grep'匹配所有一個或多個空格後緊跟grep的行。 .*一起用代表任一字元。
[] 匹配一個指定範圍內的字元,如'[Gg]rep'匹配Grep和grep。
[^] 匹配一個不在指定範圍內的字元,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一個字母開頭,緊跟rep的行。
\(..\) 標記匹配字元,如:'\(love\)',love被標記為1。
\< 錨定單詞的開始,如:'\<grep'匹配包含以grep開頭的單詞的行。
\> 錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。
x\{m\} 連續重複字元x,m次,如:'o\{5\}'匹配包含連續5個o的行。
x\{m,\} 連續重複字元x,至少m次,如:'o\{5,\}'匹配至少連續有5個o的行。
x\{m,n\} 連續重複字元x,至少m次,不多於n次,如:'o\{5,10\}'匹配連續5--10個o的行。
\w 匹配一個文字和數字字元,也就是[A-Za-z0-9],如:'G\w*p'匹配以G後跟零個或多個文字或數字字元,然後是p。
\W w的反置形式,匹配一個非單詞字元,如點號句號等。\W*則可匹配多個。
\b 單詞鎖定符,如: '\bgrep\b'只匹配grep,即只能是grep這個單詞,兩邊均為空白格。
常用選項:
-?
同時顯示匹配行上下的?行,如:grep -2 pattern filename同時顯示匹配行的上下2行。
-b,--byte-offset
列印匹配行前面列印該行所在的塊號碼。
-c,--count
只列印匹配的行數,不顯示匹配的內容。
-f File,--file=File
從檔案中提模數板。空檔案中包含0個模板,所以什麼都不匹配。
-h,--no-filename
當搜尋多個檔案時,不顯示匹配檔案名稱首碼。
-i,--ignore-case
忽略大小寫差別。
-q,--quiet
取消顯示,只返回退出狀態。0則表示找到了匹配的行。
-l,--files-with-matches
列印匹配模板的檔案清單。
-L,--files-without-match
列印不匹配模板的檔案清單。
-n,--line-number
在匹配的行前面列印行號。
-s,--silent
不顯示關於不存在或者無法讀取檔案的錯誤資訊。
-v,--revert-match
反檢索,只顯示不匹配的行。
-w,--word-regexp
如果被\<和\>引用,就把運算式做為一個單詞搜尋。
-V,--version
顯示軟體版本資訊。
執行個體:
1.在main.c檔案尋找main字串
lc@lc-Lenovo:~/work/test$ cat main.c #include <stdio.h>#include <stdlib.h>int data_array[1024*1024] = {1};//define mainint main(int argc, char* argv[]){return (0);}lc@lc-Lenovo:~/work/test$ grep 'main' main.c //define mainint main(int argc, char* argv[])lc@lc-Lenovo:~/work/test$
2.在main.c檔案中尋找以int開頭的行並列印行號
lc@lc-Lenovo:~/work/test$ cat main.c #include <stdio.h>#include <stdlib.h>int data_array[1024*1024] = {1};//define mainint main(int argc, char* argv[]){return (0);}lc@lc-Lenovo:~/work/test$ grep -n '\<int' main.c 5:int data_array[1024*1024] = {1};7:int main(int argc, char* argv[])lc@lc-Lenovo:~/work/test$
3.在main.c尋找出現指定頻率字元的行列印行號
lc@lc-Lenovo:~/work/test$ cat main.c #include <stdio.h>#include <stdlib.h>aaaaaaaaaaaaaaaaaadddddddddddddddddint data_array[1024*1024] = {1};//define mainint main(int argc, char* argv[]){return (0);}lc@lc-Lenovo:~/work/test$ grep -n '[a-c]\{5\}' main.c5:aaaaaaaaa7:aaaaa
lc@lc-Lenovo:~/work/test$ grep -n '[a-c]\{4,\}' main.c 5:aaaaaaaaa6:aaaa7:aaaaalc@lc-Lenovo:~/work/test$
~~~~~~~~~the end______________