請關注本頭條號,每天堅持更新原創乾貨技術文章。
如需學習視頻,請在微信搜索公眾號「智傳網優」直接開始自助視頻學習
1. 前言
有時間我們需要查找文件,並不是根據文件名查找文件,而是查看每個文件里的內容是否包括某些關鍵字,然後把帶有特定關鍵字內容的文件找出來。本文列舉出常用的使用命令和案例,希望能給讀者一些幫助。
2. Linux根據關鍵字查找文件內容的實用案例
Linux根據關鍵字查找文件內容的實用案例
在linux下如果要查找包含某個關鍵字的文件,如要在/root/目錄下搜索帶有關鍵字「zcwyou」的文件,在終端下運行命令:
[root@zcwyou ~]# find /root/ –type f |xargs grep 「zcwyou」
在/root/目錄下查找帶有test關鍵字的文件
[root@zcwyou ~]# grep -r 「test」 /root/
查找當前目錄及其子目錄下所有php文件中包含某關鍵字的文件,假設關鍵字為:keyword
[root@zcwyou ~]# find -name 『*.php』 |xargs grep -l 『keyword』
在Linux的終端中,搜索當前目錄和子目錄中含有某關鍵字(假設關鍵字為zcwyou)的文件,命令如下:
[root@zcwyou ~]# grep 『zcwyou』 ./ -Rn
查找目錄/var/www/html/test/里,包含帶關鍵字linuxrumen.com的文件並刪除這些文件
[root@zcwyou ~]# find /var/www/html/test/ -type f -exec grep 「linuxrumen.com」 {} \\; -print -exec rm {} \\;
查找當前目錄下的所有文件中是否含有某個字符串,假設關鍵字為zcwyou
[root@zcwyou ~]# find .|xargs grep -ri "zcwyou"
查找當前目錄下的所有文件中是否含有某個字符串
查找當前目錄下的所有文件中是否含有某個字符串(以關鍵字zcwyou為例),並且只列印出文件名
[root@zcwyou ~]# find .|xargs grep -ri "zcwyou" -l
linux 查找某目錄下包含關鍵字內容的文件
grep -r "{關鍵字}" {路徑}
linux查找某目錄下包含關鍵字內容的文件
例如:
在目錄/zcwyou/test/里,找到帶有關鍵字test文件
[root@zcwyou ~]# grep -r "test" /zcwyou/test/
3. Linux使用重定向和過濾管道組合更精準查找文件內容
linux使用重定向和過濾管道組合更精準查找文件內容
對find,xargs,grep和管道的一些深入理解
相信大家都知道在目錄中搜索含有固定字符串文件的命令:
利用find命令查找當前目錄下,後綴名為py的文件,在這些文件里,查找帶有關鍵字test的內容
[root@zcwyou ~]# find . -name '*.py' |xargs grep test
如果我們把xargs刪除,比如執行以下命令:
[root@zcwyou ~]# find . -name '*.py' |grep test
結果並不是自己所期望的。此命令只是找出文件名*.py有關鍵字test的情況,為何?
這裡就需要大家熟悉xargs的工具,下面我們科普一下shell編程里的基礎知識
3.1 參數與標準輸入
這兩個詞我們在Linux命令中是很常見的。但是參數和標準輸入其實是有區別的。我們日常使用的很多命令,例如ls -lah .中。l, a, h ,都是命令ls的參數。至於標準輸入,可以說它某種流數據。而通常來講標準輸入的流數據來源就是我們的終端輸入。在Linux命令中,有些命令可以接收標準輸入,有些是不能的。像上面的ls,就是只能接收參數,不能接收標準輸入。像cat命令或echo命令,這些是可以的。
怎麼分辨一個命令可不可以接收標準輸入?很簡單,當你敲完命令回車後,終端會等待接收你的輸入,例如當你在終端輸入cat後,終端會等待你輸入字符,當你輸入一些字符後,然後按Ctrl-C發送終止符號。這時cat命令接收標準輸入完畢,執行命令,也就是將剛才鍵入的內容輸出的標準輸出上(螢幕)。
3.2 管道
管道的作用是將前面命令的標準輸出作為後面命令的標準輸入。這裡要注意,後面的命令接收的是標準輸入,所以如果命令不支持接收標準輸入,那麼就不能直接使用管道,例如常用的ls命令,只能使用參數,而不能使用標準輸入,所以[command] | ls是不能使用的。而命令如echo或cat就可以。那麼肯定有方法來實現這些不能使用標準輸入的命令與管道結合,這時候xargs便出場了。
3.3 xargs命令
xargs命令通俗來講就是將標準輸入轉成各種格式化的參數,所以命令[command 1] | xargs [command 2]就是將command 1的標準輸出結果,通過管道|變成xargs的標準輸入,然後xargs再將此標準輸入變成參數,傳給[command 2]。這樣一來,通過xargs命令,我們便可以在管道後面使用那些不接收標準輸入的命令了。例如[command 1]|xargs ls,是不是很熟悉?
3.4 find與grep配合查找帶有特定關鍵字文件內容
我們首先來查看grep手冊。通過man grep命令。
grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a match to the given PATTERN. By default, grep prints the matching lines
那麼對於第一個命令find . -name '*.py' |grep test,是將前面命令的標準輸出作為標準輸入傳給了grep test,那麼grep是從這些標準輸入尋找test字符,也就是文件名組成的字符流, 最終選擇出的是這些文件名。
對於第二個命令find . -name '*.py' |xargs grep test,通過xargs,find得到的文件名成為了參數傳給後面的grep,那麼這時候這些文件名就是實實在在的文件標識,grep接收後會按正常的使用方式在各文件中搜尋字符串。
3.5 grep 參數
-a 不要忽略二進位數據。
-A<顯示列數> 除了顯示符合範本樣式的那一行之外,並顯示該行之後的內容。
-b 在顯示符合範本樣式的那一行之外,並顯示該行之前的內容。
-c 計算符合範本樣式的列數。
-C<顯示列數>或-<顯示列數> 除了顯示符合範本樣式的那一列之外,並顯示該列之前後的內容。
-d<進行動作> 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep命令將回報信息並停止動作。
-e<範本樣式> 指定字符串作為查找文件內容的範本樣式。
-E 將範本樣式為延伸的普通表示法來使用,意味著使用能使用擴展正則表達式。
-f<範本文件> 指定範本文件,其內容有一個或多個範本樣式,讓grep查找符合範本條件的文件內容,格式為每一列的範本樣式。
-F 將範本樣式視為固定字符串的列表。
-G 將範本樣式視為普通的表示法來使用。
-h 在顯示符合範本樣式的那一列之前,不標示該列所屬的文件名稱。
-H 在顯示符合範本樣式的那一列之前,標示該列的文件名稱。
-i 忽略字符大小寫的差別。
-l 列出文件內容符合指定的範本樣式的文件名稱。
-L 列出文件內容不符合指定的範本樣式的文件名稱。
-n 在顯示符合範本樣式的那一列之前,標示出該列的編號。
-q 不顯示任何信息。
-R/-r 此參數的效果和指定「-d recurse」參數相同。
-s 不顯示錯誤信息。
-v 反轉查找。
-w 只顯示全字符合的列。
-x 只顯示全列符合的列。
-y 此參數效果跟「-i」相同。
-o 只輸出文件中匹配到的部分。
4. 總結
grep命令只能查找文本文件的內容,並不能查找二進位和其它類型文件的內容,這些非本文的文件也沒有查看的意義和必要。常用的場景是使用grep命令查看某程序的配置文件,根據某參數作為查找關鍵字的目標。熟練掌握find和grep,將會極大提高文本處理效率。
本文已同步至博客站,尊重原創,轉載時請在正文中附帶以下連結:
https://www.linuxrumen.com/rmxx/1126.html
點擊了解更多,快速查看更多的技術文章列表。