Linux常用命令-find grep

來源:互聯網
上載者:User

一.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______________





相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.