RHEL6基础之八查找、文件内容查看类命令
find--在某個指定的路徑下查找需要的文件或目錄
格式:
find [查找位置] [查找標準] [處理動作]
查找位置:默認為當前目錄,可以指定多個目錄,多個之間用空格
查找標準:默認為查找指定目錄下的所有文件
處理動作:顯示到標準輸出,默認為print
查找標準
以文件名查找
-name "文件名稱" : 根據文件名查找,支持glob(文件名通配),注意文件名需用雙引號
[root@localhost?~]#?find?/etc/?-name?"ifcfg-eth0" /etc/sysconfig/network-scripts/ifcfg-eth0 [root@localhost?~]#?find?/etc/?-name?"ifcfg*" /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-eth0bak [root@localhost?~]#
-iname "文件名稱",根據文件名查找,不區分大小寫
[root@localhost?~]#?mkdir?Justin?juStin?jusTin [root@localhost?~]#?find?-iname?"justin" ./juStin ./jusTin ./Justin [root@localhost?~]#
-inum "文件inode",查找指定inode的文件
find?./*?-inum?1049741?-delete直接刪除,不會詢問你確認刪除。
以文件的屬性查找
-user "USERNAME" ----根據屬主查找
-group "GROUP" --- 根據屬組查找
-uid "UID" ---根據UID查找
-gid "GID" ---根據GID查找
-nouser--- 查找沒有屬主的文件
-nogroup--- 查找沒有屬組的文件
#在/dev目錄下查找用戶名為root組為disk的文件并用長格式顯示 [root@localhost?~]#?find?/dev/?-user?root?-a?-group?disk?-ls10630????0?crw-rw----???1?root?????disk??????????????9月?24?10:18?/dev/sg010241????0?brw-rw----???1?root?????disk??????????????9月?24?10:18?/dev/ram39915????0?brw-rw----???1?root?????disk??????????????9月?24??2013?/dev/ram1
多條件查找連接符
-a: 與
-o: 或
-not、!:非
[root@localhost?home]#?ls 111.txt??222.log??justin??justin1??justin2 [root@localhost?home]#?find?/home/?-name?"*.txt"?-o?-name?"*.log" /home/222.log /home/111.txt [root@localhost?home]#?find?/home/?-name?"*.txt"?-a?-name?"*.log"以文件類型查找
-type 文件類型
文件類型指的是普通文件(f)、目錄(d)、塊設備文件(b)、字符設備文件(c)、符號鏈接文件(l)、命令管道文件(p)、套接字文件(s)等
[root@localhost?~]#?find?/bin/?-type?l /bin/mail /bin/rview /bin/ex /bin/gtar
以文件大小查找
-size”大小條件
一般使用“+”、“-”號設置超過或小于指定的大小作為查找條件。常用的容量單位包括k(注意是小寫)、M、G。
[root@localhost?~]#?find?/root/?-size?2k????????;大小為2K的文件 /root/.gconf/apps/brasero/config/priority/%gconf.xml /root/.gconf/desktop/gnome/accessibility/keyboard/%gconf.xml /root/.gnote/89099c13-c354-48d6-89ce-0415b1db3c78.note /root/.gnote/db520e7c-3433-4433-b35a-3ad9a14e16d4.note /root/anaconda-ks.cfg [root@localhost?~]#?find?/root/?-size?+50k???;大小超過50k的文件 /root/.cache/ibus/pinyin/user-1.3.db /root/.cache/ibus/bus/registry.xml /root/.pulse/8665cfcff9c76f94fac16e0000000022-device-volumes.tdb /root/.gstreamer-0.10/registry.i386.bin /root/.gconfd/saved_state [root@localhost?~]#
-empty 空文件(目錄)
[root@localhost?~]#?find?-empty?/-maxdepth 限制find命令在目錄中按照遞減方式查找文件的時候搜索文件超過某個級別或者搜索過多的目錄
[root@localhost?~]#?find?.?-maxdepth?2?-name?fred假如這個fred文件在./sub1/fred目錄中,那么這個命令就會直接定位這個文件,查找很容易成功。假如,這個文件在./sub1/sub2/fred目錄中,那么這個命令就無法查找到。因為前面已經給find命令在目錄中最大的查詢目錄級別為2,只能查找2層目錄下的文件。這樣做的目的就是為了讓find命令更加精確的定位文件,如果你已經知道了某個文件大概所在的文件目錄級數,那么加入-maxdepth n 就很快的能在指定目錄中查找成功。
-depth?? #使查找在進入子目錄前先行查找完本目錄減方
-mount?????????????????????? #查文件時不跨越文件系統mount點
-follow????????????????????? #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
以文件修改時間查找
-atime [+|-]# :?access time訪問時間,默認為天,#表示#天的這個時間點,+#表示至少有#天沒訪問, -#表示#天之內有訪問
-mtime [+|-]# : modify time修改時間,#表示#天的這個時間點沒有被修改,+#表示至少有#天沒有修改 , -#表示#天之內有修改
-ctime [+|-]# : change time改變時間,#表示#天的這個時間點沒有被改變,+#表示至少有#天沒有被改變 , -#表示#天之內有被改變
mtime和ctime的區別在于,只有修改了文件的內容,才會更新文件的mtime,而對文件更名,修改文件的屬主等操作,只會更新ctime。舉例說明: 對文件進行mv操作,mtime不變,ctime更新;編輯文件內容,mtime和ctime同時修改。
-amin [+|-]# :時間為分鐘,#表示#分鐘的這個時間點沒有被訪問,+#表示至少有#分鐘沒有被訪問 , -#表示#分鐘之內訪問
-mmin [+|-]# :時間為分鐘,#表示#分鐘的這個時間點沒有被修改,+#表示至少有#分鐘沒有被修改 , -#表示#分鐘之內有被修改
-cmin [+|-]# :時間為分鐘,#表示#分鐘的這個時間點沒有被改變,+#表示至少有#分鐘沒有被改變 , -#表示#分鐘之內有被改變
[root@localhost?logs]#?find?/opt/queryweb/logs?-mtime?+7?-type?f?-name?"*.log"?-exec?rm?-f?{}?\; [root@localhost?logs]#查看和修改文件時間
? modification time(mtime,修改時間):當該文件的“內容數據”更改時,就會更新這個時間。內容數據指的是文件的內容,而不是文件的屬性。比如:vim后保存文件。ls -l列出的時間就是這個時間。
? status time(ctime,狀態時間):當該文件的”狀態(status)”改變時,就會更新這個時間,舉例來說,更改了權限與屬性,就會更新這個時間。
? access time(atime,存取時間):當“取用文件內容”時,就會更新這個讀取時間。舉例來說,使用cat、more去讀取 ~/.bashrc,就會更新ati,,ls、stat命令都不會修改文件的訪問時間
1、stat查看文件時間
2、ls查看文件時間
[root@Super?justin]#?ls?-l?--time=ctime?companies.csv? -rw-r--r--?1?justin?justin?123011072?Oct?10?16:00?companies.csv [root@Super?justin]#?ls?-l?--time=atime?companies.csv? -rw-r--r--?1?justin?justin?123011072?Oct?10?15:55?companies.csv [root@Super?justin]#ls參數里沒有--mtime這個參數,因為我們默認通過ls -l查看到的時間就是mtime
3、修改文件時間
touch來修改文件時間
-a : 僅修改access time。
-c : 僅修改時間,而不建立文件。
-d : 后面可以接日期,也可以使用 --date="日期或時間"
-m : 僅修改mtime。
-t : 后面可以接時間,格式為 [YYMMDDhhmm]
touch -acmr companies.csv SHYH_file.txt???? 把后一個文件的時間修改成和前一個相同
[root@Super?justin]#?stat?companies.csv?SHYH_file.txt?File:?‘companies.csv’Size:?123011072?????Blocks:?240256?????IO?Block:?4096???regular?file Device:?803h/2051d????Inode:?69567919????Links:?1 Access:?(0644/-rw-r--r--)??Uid:?(?1002/??justin)???Gid:?(?1002/??justin) Access:?2018-11-13?12:42:13.000000000?+0800 Modify:?2018-11-12?12:42:13.000000000?+0800 Change:?2018-11-13?12:44:04.007434571?+0800Birth:?-File:?‘SHYH_file.txt’Size:?187???????????Blocks:?8??????????IO?Block:?4096???regular?file Device:?803h/2051d????Inode:?67449450????Links:?1 Access:?(0644/-rw-r--r--)??Uid:?(?1002/??justin)???Gid:?(?1002/??justin) Access:?2018-06-09?20:27:24.505046754?+0800 Modify:?2018-06-09?20:27:09.664047769?+0800 Change:?2018-06-09?20:27:09.664047769?+0800Birth:?- [root@Super?justin]#?touch?-acmr?companies.csv?SHYH_file.txt? [root@Super?justin]#?stat?companies.csv?SHYH_file.txt?File:?‘companies.csv’Size:?123011072?????Blocks:?240256?????IO?Block:?4096???regular?file Device:?803h/2051d????Inode:?69567919????Links:?1 Access:?(0644/-rw-r--r--)??Uid:?(?1002/??justin)???Gid:?(?1002/??justin) Access:?2018-11-13?12:42:13.000000000?+0800 Modify:?2018-11-12?12:42:13.000000000?+0800 Change:?2018-11-13?12:44:04.007434571?+0800Birth:?-File:?‘SHYH_file.txt’Size:?187???????????Blocks:?8??????????IO?Block:?4096???regular?file Device:?803h/2051d????Inode:?67449450????Links:?1 Access:?(0644/-rw-r--r--)??Uid:?(?1002/??justin)???Gid:?(?1002/??justin) Access:?2018-11-13?12:42:13.000000000?+0800 Modify:?2018-11-12?12:42:13.000000000?+0800 Change:?2018-11-13?12:45:46.876431277?+0800Birth:?- [root@Super?justin]#touch -d "2 days ago" companies.csv??? 支持像date命令一樣參數修改文件時間
[root@Super?justin]#?touch?-d?"2?days?ago"?companies.csv? [root@Super?justin]#?stat?companies.csv?File:?‘companies.csv’Size:?123011072?????Blocks:?240256?????IO?Block:?4096???regular?file Device:?803h/2051d????Inode:?69567919????Links:?1 Access:?(0644/-rw-r--r--)??Uid:?(?1002/??justin)???Gid:?(?1002/??justin) Access:?2018-11-11?12:47:19.500920869?+0800 Modify:?2018-11-11?12:47:19.500920869?+0800 Change:?2018-11-13?12:47:19.500424943?+0800Birth:?- [root@Super?justin]#-newer?? f1 !f2 ?查找更改時間比f1新但比f2舊的文件
以文件權限查找
-perm [+|-] MODE
?不帶[+|-]表示精確權限匹配,
?+表示任何一類用戶的任何一位權限匹配
?- 表示每類用戶的每位權限都匹配
#精確匹配/etc下權限為755的文件。ugo都必須同時滿足 [root@localhost?~]#?find?/etc/?-perm?755?-ls?|more 622593???16?drwxr-xr-x??98?root?????root????????12288?Aug??6?14:39?/etc/ 622778????8?drwxr-xr-x???2?root?????root?????????4096?Jan?12??2007?/etc/jvm 622638????8?drwxr-xr-x???2?root?????root?????????4096?Aug??2?16:44?/etc/xinetd.d #755用二進制表示為111?101?101;+后跟權限匹配原則是滿足所有權限位的一個位就可以 [root@localhost?~]#?find?/etc/?-perm?+755?-ls?|more 622593???16?drwxr-xr-x??98?root?????root????????12288?Aug??6?14:39?/etc/ 622625????8?-rw-r--r--???1?root?????root??????????135?Aug??6?13:31?/etc/printcap 622645???20?-rw-r--r--???1?root?????root????????14100?Sep??5??2006?/etc/mime.types #-后跟權限匹配原則是ugo中所有位權限必須同時滿足,屬主必須為rwx,屬組和other至少為rw [root@localhost?~]#?find?/etc/?-perm?-755?-ls?|more 622593???16?drwxr-xr-x??98?root?????root????????12288?Aug??6?14:39?/etc/ 622778????8?drwxr-xr-x???2?root?????root?????????4096?Jan?12??2007?/etc/jvm 622638????8?drwxr-xr-x???2?root?????root?????????4096?Aug??2?16:44?/etc/xinetd.d
處理動作
-print---find命令將匹配的文件輸出到標準輸出。
-exec---對匹配的文件執行該參數所給出的shell命令。相應命令的形式為'command' {} \;,注意{}和\;之間的空格,同時兩個{}之間沒有空格
-ok---和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。
#?在當前目錄下查找除目錄以外的所有類型的文件?,并打印出來 [root@localhost?test]#?find?.?!?-type?d?–print #查找root目錄下的以log結尾的文件,將其復制到test目錄下。 [root@localhost?test]#?find?/root?–name?“*log”?–type?f?–exec?cp?{}?/root/test/?\;?2>/dev/null #通過-exec參數指定后面要執行的命令,{}表示將查找到的內容全部復制,\;表示命令的結束,2>/dev/null是指將執行查找過程中出現的錯誤信息重定向到黑洞文件中,也就是不顯示那些錯誤信息。 #長格式顯示test下的普通文件 [root@localhost?test]#?find?.?-type?f?-exec?ls?-l?{??}?\; #***test下大小為0的文件 [root@localhost?test]#?find?./?-size?0?-exec?rm?{}?\; #在當前目錄中查找所有文件名以.conf結尾、更改時間在5日以上的文件,并***它們,只不過在***之前先給出提示 [root@localhost?test]#?find?.?-name?"*.conf"??-mtime?+5?-ok?rm?{??}?\;
/dev/null,外號叫"黑洞",它等價于一個只寫文件,所有寫入它的內容都會永遠丟失.,而嘗試從它那兒讀取內容則什么也讀不到。如果不想讓消息以標準輸出顯示或寫入文件,那么可以將消息重定向到它。
/dev/zero主要的用處是用來創建一個指定長度用于初始化的空文件,就像臨時交換文件。
xargs
?在使用find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之后,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,這樣它可以先處理最先獲取的一部分文件,然后是下一批,并如此繼續下去。
在有些系統中,使用-exec選項會為處理每一個匹配到的文件而發起一個相應的進程,并非將匹配到的文件全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高;
而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。
#查找系統中的每一個普通文件,然后使用xargs命令來測試它們分別屬于哪類文件[root@localhost?~]#?find?.?-type?f?-print?|?xargs?file #在整個系統中查找內存信息轉儲文件(core?dump)?,然后把結果保存到/tmp/core.log?文件中: [root@localhost?~]#?find?/?-name?"core"?-print?|?xargs?echo?""?>/tmp/core.log #用grep命令在所有的普通文件中搜索hostname這個詞 [root@localhost?~]#?find?.?-type?f?-print?|?xargs?grep?"hostname" #***3天以前的所有東西?(find?.?-ctime?+3?-exec?rm?-rf?{}?\;) [root@localhost?~]#?find?./?-mtime?+3?-print|xargs?rm?-f?–r #***文件大小為零的文件 [root@localhost?~]#?find?./?-size?0?|?xargs?rm?-f?&
xargs
xargs命令是給其他命令傳遞參數的一個過濾器,也是組合多個命令的一個工具。它擅長將標準輸入數據轉換成命令行參數,默認從管道傳來的值是放在最后的
xargs能夠處理管道或者stdin并將其轉換成特定命令的命令參數。xargs是構建單行命令的重要組件之一。
xargs也可以將單行或多行文本輸入轉換為其他格式,例如多行變單行,單行變多行。xargs的默認命令是echo,空格是默認定界符。這意味著通過管道傳遞給xargs的輸入將會包含換行和空白,不過通過xargs的處理,換行和空白將被空格取代。xargs是構建單行命令的重要組件之一。如下:
[root@localhost?~]#?cat?xargs.txt? 1?2?3?4 a?b?c?d A?B?C?D a1?b2?c3?d4 A1?B2?C3?D4 [root@localhost?~]#?cat?xargs.txt?|?xargs 1?2?3?4?a?b?c?d?A?B?C?D?a1?b2?c3?d4?A1?B2?C3?D4 [root@localhost?~]#????-0 當sdtin含有特殊字元時候,將其當成一般字符,像/'空格等
????-a?file?從文件中讀入作為sdtin
????-e?flag?,注意有的時候可能會是-E,flag必須是一個以空格分隔的標志,當xargs分析到含有flag這個標志的時候就停止。
???-p 操作具有可交互性,每次執行comand都交互式提示用戶選擇
????-n xargs 的-n選項設置每次送給command命令的參數個數,參數以空白字符或<newline>換行符分割
????-t 啟用命令行輸出模式:其先回顯要運行的命令,然后執行命令,打印出命令結果,跟蹤與調試xargs的利器,也是研究xargs運行原理的好辦法;
????-i -i 選項告訴 xargs 可以使用{}代替傳遞過來的參數, 建議使用-I,其符合POSIX標準
? ?-I ?格式: xargs -I rep-str comand rep-srt rep-str 為代替傳遞給xargs參數, 可以使 {} $ @ 等符號 ,其主要作用是當xargs command 后有多個參數時,調整參數位置。eg:find . -name "*.txt " |xargs -I {} cp {} /tmp ;默認管道會將find的結果傳遞給cp做為最后的參數,通過-I來指定起傳遞過來參數的未知
????-r 如果沒有要處理的參數傳遞給xargsxargs 默認是帶 空參數運行一次,如果你希望無參數時,停止 xargs,直接退出,使用 -r 選項即可,其可以防止xargs 后面命令帶空參數運行報錯。If the standard input does not contain any nonblanks, do not run the command, exit
????-s size 設置每次構造Command行的長度總大小,包括 command +init-param +傳遞參數,Size 參數必須是正整數
????-L??num?Use?at?most?max-lines?nonblank?input?lines?per?command?line.-s是含有空格的。
????-l??同-L
????-d?delim?分隔符,默認的xargs分隔符是回車,argument的分隔符是空格,這里修改的是xargs的分隔符
[root@localhost?~]#?echo?"51ctox51ctox51cto"|xargs?-dx 51cto?51cto?51cto[root@localhost?~]#?echo?"51ctox51ctox51cto"|xargs?-n1?-dx 51cto 51cto 51cto[root@localhost?~]#????-x?exit的意思,主要是配合-s使用。
? ?-e 選項,只能傳遞一個參數。在單條命令中使用多個 -e 選項,得到多個pattern,以此實現OR操作。
????-P?修改最大的進程數,默認是1,為0時候為as?many?as?it?can?,這個例子我沒有想到,應該平時都用不到的吧。
查找并顯示文件
找到某個文件是我們的目的,我們更想知道查找到的文件的詳細信息和屬性,如果我們采取現查找文件,在使用LS命令來查看文件信息是相當繁瑣的,現在我們也可以把這兩個命令結合起來使用。
[root@localhost?~]#?find?/?-name?"httpd.conf"?-ls? 12063?34?-rw-r--r--?1?root?root?33545?Dec?30?15:36?/etc/httpd/conf/httpd.conf [root@localhost?~]#find命令配合使用exec和xargs可以使用戶對所匹配到的文件執行幾乎所有的命令。
查找排除某個目錄
-prune #忽略某個目錄
[root@Super?svn]#?find?127_Client/?-type?f?-iname?"[[:digit:]]*" 127_Client/product/938592691/127B/201801311237/CFG/127Bcfg.zip 127_Client/product/938592691/321/201801311237/CFG/321cfg.zip 127_Client/938592691/127B/201801311237/CFG/127Bcfg.zip 127_Client/938592691/321/201801311237/CFG/321cfg.zip [root@Super?svn]#?find?127_Client/?-path?127_Client/product?-prune?-o?-type?f?-iname?"[[:digit:]]*" 127_Client/product 127_Client/938592691/127B/201801311237/CFG/127Bcfg.zip 127_Client/938592691/321/201801311237/CFG/321cfg.zip [root@Super?svn]#?find?127_Client/?-path?127_Client/product?-prune?-o?-type?f?-iname?"[[:digit:]]*"?-print 127_Client/938592691/127B/201801311237/CFG/127Bcfg.zip 127_Client/938592691/321/201801311237/CFG/321cfg.zip [root@Super?svn]#?find?127_Client/?\(?-path?127_Client/product?-o?-path?127_Client/938592691/127B?\)?-prune?-o?-type?f?-iname?"[[:digit:]]*"?-print 127_Client/938592691/321/201801311237/CFG/321cfg.zip [root@Super?svn]#注意:排除的目錄后面不能帶"/",且要忽略的路徑參數必須緊跟著搜索的路徑之后,否則不起作用,-o參數必須加上,路徑有空格必須用雙引號括起來,排除多個目錄需要使用圓括號括起來,且括號前后需要用轉義符轉義,讓shell不對括號做特殊解釋,而留給find命令解釋其意義。
which---查找外部命令所對應的程序文件
[root@localhost?~]#?which?ls alias?ls='ls?--color=auto'/bin/ls [root@localhost?~]#?which?pwd /bin/pwd [root@localhost?~]#?which?cd /usr/bin/which:?no?cd?in?(/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin) [root@localhost?~]#
說明:which命令用于查找Linux外部命令所對應的程序文件,其搜索范圍由環境變量PATH決定,在PATH變量指定的路徑中,搜索某個系統命令的位置,并且返回第一個搜索結果。也就是說,使用which命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令,執行命令后,首先顯示出系統中所設置命令的別名,然后是命令的程序文件如“/bin/ls”。如果要查找的是一個內部命令,那將找不到任何對應的程序文件如cd。
whereis---查找文件或目錄
-b---只找二進制文檔
-m---只查找manual路徑下的文件
-s---只查找source下的
-u---查找以上三個找不到的文件檔案
[root@localhost?~]#?whereis?pwd pwd:?/bin/pwd?/usr/share/man/man1/pwd.1.gz?/usr/share/man/man1p/pwd.1p.gz [root@localhost?~]#?whereis?etc etc:?/usr/local/etc [root@localhost?~]#?whereis?-b?pwd pwd:?/bin/pwd [root@localhost?~]#?whereis?-m?pwd pwd:?/usr/share/man/man1/pwd.1.gz?/usr/share/man/man1p/pwd.1p.gz [root@localhost?~]#?whereis?-s?pwd pwd: [root@localhost?~]#?whereis?-u?pwd pwd:?/bin/pwd?/usr/share/man/man1/pwd.1.gz?/usr/share/man/man1p/pwd.1p.gz [root@localhost?~]#
說明:只能用于程序名的搜索,而且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s),如果省略參數,則返回所有信息
locate---查找文件
說明:locate命令其實是“find -name”的另一種寫法,但是要比后者快得多,原因在于它不搜索具體目錄,而是搜索一個數據庫(/var/lib/locatedb),這個數據庫中含有本地所有文件信息。Linux系統自動創建這個數據庫,并且每天自動更新一次,所以使用locate命令查不到最新變動過的文件。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫
grep---Global Regular Expression Print全局搜索正則表達式并將結果打印出來---在文件中查找并顯示包含指定字符串的行,目標是字符串
格式:grep [參數] 查找條件 目標文件
功能說明:grep指令是一種強大的文本搜索工具,是一個對行進行搜索的操作,它能使用正則表達式搜索文本,用于查找內容包含指定的范本樣式的文件,如果發現某文件的內容符合所指定的范本樣式,預設grep指令會把含有范本樣式的那一行顯示出來。若不指定任何文件名稱,或是所給予的文件名為“-”,則grep指令會從標準輸入設備讀取數據。
Unix的grep家族包括grep、egrep和fgrep。 egrep表示擴展的grep,相比grep支持更多的元字符(元字符就是指那些在正則表達式中具有特殊意義的專用字符),"grep -E"相當于egrep。fgrep是fast grep,不支持元字符,但是搜索速度更快。grep搜索的結果被送到屏幕,不影響原文件內容。
-a 不要忽略二進制數據。
-A<顯示列數> 除了顯示符合范本樣式的那一行之外,并顯示該行之后的內容。
-b 在顯示符合范本樣式的那一行之外,并顯示該行之前的內容。
-c 計算符合范本樣式的列數。
-C<顯示列數>或-<顯示列數> ?除了顯示符合范本樣式的那一列之外,并顯示該列之前后的內容。
-d<進行動作> 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep命令將回報信息并停止動作。
-e<范本樣式> 指定字符串作為查找文件內容的范本樣式。
-E 將范本樣式為延伸的普通表示法來使用,意味著使用能使用擴展正則表達式。
-f<范本文件> 指定范本文件,其內容有一個或多個范本樣式,讓grep查找符合范本條件的文件內容,格式為每一列的范本樣式。
-F 將范本樣式視為固定字符串的列表。
-G 將范本樣式視為普通的表示法來使用。
-h 在顯示符合范本樣式的那一列之前,不標示該列所屬的文件名稱。
-H 在顯示符合范本樣式的那一列之前,標示該列的文件名稱。
-i 忽略字符大小寫的差別。
-l 列出文件內容符合指定的范本樣式的文件名稱。
-L 列出文件內容不符合指定的范本樣式的文件名稱。
-n 在顯示符合范本樣式的那一列之前,標示出該列的編號。
-q 不顯示任何信息。在靜默模式中,grep 命令不會向標準輸出打印任何輸出,它僅是運行命令,然后根據命令執行成功與否返回退出狀態,沒有找到值則返回狀態為1,找到則返回0.例:grep -q 'abc' test.txt
-R/-r 此參數的效果和指定“-d recurse”參數相同。
-s 不顯示錯誤信息。
-v 反轉查找。
-w 只顯示全字符合的列。
-x 只顯示全列符合的列。
-y 此參數效果跟“-i”相同。
-o 只輸出文件中匹配到的部分。
grep搜索建議:
匹配字符串、調用變量時建議使用雙引號:grep "ZOO_INFO" zookeeper.log ??g r e p“$ M Y VA R”?zookeeper.log
正則匹配應使用單引號:grep ‘\<ZOO_INFO\>’ zookeeper.log
--color=auto 匹配的關鍵用顏色顯示出來
如果每次使用 grep 都得要自行加上 --color=auto 需要在 ~/.bashrc 內加上這行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』來立即生效即可
[root@justin?~]#?source?/root/.bashrc-v---反向查找,即輸出與查找條件不相符的行
-i或--ignore-case---忽略字符大小寫的差別
[root@localhost?home]#?echo?"a"?>?i [root@localhost?home]#?echo?"A"?>>?i [root@localhost?home]#?cat?i a A [root@localhost?home]#?grep?"a"?i a [root@localhost?home]#?grep?-i?"a"?i a A [root@localhost?home]#-E---多個字符串一起搜尋,就是egrep
[root@justin?~]#?cat?/etc/samba/smb.conf?|egrep?-v?'#|;'
過濾掉#號和;號的行
-A<顯示行數n>或--after-context=<顯示行數n> 除了顯示符合范本樣式的那一列之外,并顯示該行之后n行的內容。
[root@localhost?~]#?cat?/boot/grub/grub.conf?|?grep?-A?2?title title?Red?Hat?Enterprise?Linux?(2.6.32-279.el6.i686)root?(hd0,0)kernel?/vmlinuz-2.6.32-279.el6.i686?ro?root=UUID=31d213fb-c46d-4b1d-9300-f43c0c7afb94?rd_NO_LUKS??KEYBOARDTYPE=pc?KEYTABLE=us?rd_NO_MD?crashkernel=auto?LANG=zh_CN.UTF-8?rd_NO_LVM?rd_NO_DM?rhgb?quiet [root@localhost?~]#?cat?/boot/grub/grub.conf?|?grep?title title?Red?Hat?Enterprise?Linux?(2.6.32-279.el6.i686) [root@localhost?~]#
-B<顯示行數n>或--before-context=<顯示行數n> 除了顯示符合范本樣式的那一行之外,并顯示該行之前n行內容
[root@localhost?~]#?cat?/boot/grub/grub.conf?|?grep?-B?2?title splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title?Red?Hat?Enterprise?Linux?(2.6.32-279.el6.i686) [root@localhost?~]#
-C<顯示行數n>或--context=<顯示行數n>或-<顯示行數n> 除了顯示符合范本樣式的那一行之外,并顯示該行之前后n行的內容。
[root@localhost?~]#?cat?/boot/grub/grub.conf?|?grep?-C?2?title splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title?Red?Hat?Enterprise?Linux?(2.6.32-279.el6.i686)root?(hd0,0)kernel?/vmlinuz-2.6.32-279.el6.i686?ro?root=UUID=31d213fb-c46d-4b1d-9300-f43c0c7afb94?rd_NO_LUKS??KEYBOARDTYPE=pc?KEYTABLE=us?rd_NO_MD?crashkernel=auto?LANG=zh_CN.UTF-8?rd_NO_LVM?rd_NO_DM?rhgb?quiet [root@localhost?~]#-c或--count 計算符合范本樣式行數。
[root@localhost?~]#?cat?/boot/grub/grub.conf?|?grep?-c?2.6.32 3 [root@localhost?~]#?cat?/boot/grub/grub.conf #?grub.conf?generated?by?anaconda # #?Note?that?you?do?not?have?to?rerun?grub?after?making?changes?to?this?file #?NOTICE:??You?have?a?/boot?partition.??This?means?that #??????????all?kernel?and?initrd?paths?are?relative?to?/boot/,?eg. #??????????root?(hd0,0) #??????????kernel?/vmlinuz-version?ro?root=/dev/sda2 #??????????initrd?/initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title?Red?Hat?Enterprise?Linux?(2.6.32-279.el6.i686)root?(hd0,0)kernel?/vmlinuz-2.6.32-279.el6.i686?ro?root=UUID=31d213fb-c46d-4b1d-9300-f43c0c7afb94?rd_NO_LUKS??KEYBOARDTYPE=pc?KEYTABLE=us?rd_NO_MD?crashkernel=auto?LANG=zh_CN.UTF-8?rd_NO_LVM?rd_NO_DM?rhgb?quietinitrd?/initramfs-2.6.32-279.el6.i686.img [root@localhost?~]#
-r或--recursive 遞歸的搜索
當要只知道要查找的字符串大致的目錄位置不清除具體路徑,通過遞歸搜索查找到
-L:輸出時只顯示不包含匹配項的文件名。
-l ----只顯示匹配字符串的文件名不顯示匹配的行,小寫的L,通常和-r 一起使用
[root@justin?~]#?mkdir?-p?/home/grep/{grep1,grep2} [root@justin?~]#?touch?/home/grep/grep1/a.txt [root@justin?~]#?echo?"1?2?3"?>?/home/grep/grep1/a.txt [root@justin?~]#?touch?/home/grep/grep1/1.txt [root@justin?~]#?echo?"a?b?c"?>?/home/grep/grep1/1.txt [root@justin?~]#?grep?"a"?/home/grep/ [root@justin?~]#?grep?"a"?-r?/home/grep/ /home/grep/grep1/1.txt:a?b?c [root@justin?~]#?grep?"a"?-rl?/home/grep/ /home/grep/grep1/1.txt [root@justin?~]#
-n或--line-number---在顯示符合范本樣式的那一行之前,標示出該列的行數編號
[root@localhost?~]#?cat?/boot/grub/grub.conf?|?grep?-n?title 14:title?Red?Hat?Enterprise?Linux?(2.6.32-279.el6.i686) [root@localhost?~]#-o:只顯示被模式匹配到的字符串,而不是整個行
[root@localhost?~]#?cat?/boot/grub/grub.conf?|?grep?-no?title 14:title [root@localhost?~]#
-h:輸出時每行行首不顯示文件名
。-H:輸出時每行行首顯示文件名。
-w, –word-regexp:精確匹配,匹配單詞還不是字符串,如想匹配“justin”,”justin_peng”就不會被匹配
\<: 單詞錨定詞首,例如\<r..t 那么root、rooter均可以匹配,而chroot就不能匹配
\>: 單詞錨定詞尾,例如r..t\> 那么root、chroot均可匹配,而chroot就不能匹配,如果要錨定root 可以使用\<root\>
[root@justin?home]#?cat?grep.txt? justin justin_peng [root@justin?home]#?grep?"justin"?grep.txt? justin justin_peng [root@justin?home]#?grep?-w?"justin"?grep.txt? justin [root@justin?home]#-R, -r, –recursive:遞歸搜索,查找你搜索的目錄或子目錄下的所有含有某個你要找的文件.
[root@justin?grep]#?grep?"justin"?/home/ [root@justin?grep]#?grep?-R?"justin"?/home/ /home/grep/grep.txt:justin /home/grep.txt:justin /home/grep.txt:justin_peng [root@justin?grep]#-R, -r, --recursive?????? equivalent to --directories=recurse
????? --include=FILE_PATTERN? 只搜索匹配FILE_PATTERN的文件
????? --exclude=FILE_PATTERN? 忽略匹配FILE_PATTERN的文件和目錄
????? --exclude-from=FILE?? 忽略匹配從FILE中獲取的FILE_PATTERN的文件
????? --exclude-dir=PATTERN? 忽略匹配FILE_PATTERN的目錄
忽略/home/neo4j/目錄及其子目錄下所有以.log或者.heapsnapshot結尾的文件
[root@localhost?app]#?grep?-ir?'/home/neo4j/'?neo4jDB_update?-R?--include=source.yml.20180903bak目錄下source.yml.20180903bak里搜索指定的字符
[root@localhost?app]#?grep?-ir?'/home/neo4j/'?neo4jDB_update?-r?--exclude-dir={logs,log,heapDumpFile}指定目錄里排除特定的目錄的目錄里搜索指定字符
注意,這里include、exclude都是文件名或者目錄名,不是文件或者目錄的路徑,-R或者-r都是遞歸搜索
對多個文件進行搜索
正則匹配:
符號”[]“表示匹配指定范圍內的任意單個字符,'passw[Oo]rd'匹password和passwOrd
[root@justin?~]#?echo?"password"?>?/home/grep/grep1/a.txt [root@justin?~]#?echo?"passwOrd"?>>?/home/grep/grep1/a.txt [root@justin?~]#?grep?-nr?'passw[oO]rd'?/home/grep/ /home/grep/grep1/a.txt:1:password /home/grep/grep1/a.txt:2:passwOrd [root@justin?~]#[] 里面不論有幾個字節,他都謹一個一個字節的匹配,也就是只會匹配password和passwOrd,而不會匹配passwoOrd,在一組集合字節中,如果該字節組是連續的,例如大寫英文/小寫英文/數字等等, 就可以使用[a-z],[A-Z],[0-9],[a-zA-Z]等方式來書寫
如果要匹配空格,最好用空格的[:space:]來匹配,如果直接用空格來匹配那么tab產生的空格是不會匹配的
[root@justin?~]#?grep?'[[:space:]]'?grep.txt[[:alpha:]] 代表英文大小寫字母 a-z A-Z
[[:upper:]] :表示大寫字母[A-Z]
[[:alnum:]]: 所有的字母和數字
[[:blank:]] [[:space:]]?代表空格鍵與 [Tab] 按鍵兩者
[[:digit:]] :表示數字 [0-9]
符號"[^]"表示匹配指定范圍之外的任意單個字符,如:'[^a-fA-F]oo'匹配不包含A-F和a-f的一個字母開頭,緊跟oo的行。
[root@justin?~]#?echo?"Google"?>?/home/grep/grep1/1.txt [root@justin?~]#?echo?"google"?>>?/home/grep/grep1/1.txt [root@justin?~]#?echo?"Foogle"?>>?/home/grep/grep1/1.txt [root@justin?~]#?echo?"foogle"?>>?/home/grep/grep1/1.txt [root@justin?~]#?cat?/home/grep/grep1/1.txt Google google Foogle foogle [root@justin?~]#?grep?'[^a-fA-F]oo'?/home/grep/grep1/1.txt Google google [root@justin?~]#符號“^”表示以什么字符開頭,“^word”表示以“word”開頭,如果word前面有空格時需要使用[:space:]來匹配前面的空格[root@Zabbix_server home]# grep '^[[:space:]]*root' punct.txt
符號“$”表示以什么字符結尾,“word$”表示以“word”結尾。如果word后面有符號匹配時候需要使用[:punct:]來匹配后的符號[root@Zabbix_server home]# grep 'root[[:punct:]]*$' punct.txt 表示匹配punct.txt文件中以root單詞結尾后面接任意多個符號的行
匹配行尾為小數點(.)因為小數點具有其他意義(底下會介紹),所以必須要使用轉義字符(\)來加以解除其特殊意義,轉義為一個普通字符!
[root@justin?~]#?grep?'.$'?/home/grep/grep1/a.txt grep grap grbp grabp grcbp grcbp. [root@justin?~]#?grep?'\.'?/home/grep/grep1/a.txt grcbp. [root@justin?~]#小數點”.“表示任意一個非換行符的字符,'gr.p'匹配gr后接一個任意字符,然后是p
[root@justin?~]#?echo?"grep"?>?/home/grep/grep1/a.txt [root@justin?~]#?echo?"grap"?>>?/home/grep/grep1/a.txt [root@justin?~]#?echo?"grbp"?>>?/home/grep/grep1/a.txt [root@justin?~]#?echo?"grabp"?>>?/home/grep/grep1/a.txt [root@justin?~]#?echo?"grcbp"?>>?/home/grep/grep1/a.txt [root@justin?~]#?grep?'gr.p'?/home/grep/grep1/a.txt grep grap grbp [root@justin?~]#
星號“*”:基本正則表達式中表示匹配其前的字符出現0次或任意次數,例如ab*c,那么ac、abc、acc都會匹配,而abdc就不匹配,星號在基本正則表達式里只指次數,*不會匹配隱藏文件。只表示次數,不表示任意字符
擴展正則表達式中多以下元字符:
+ 匹配一個或多個前面的字符.它的作用和*很相似,但唯一的區別是它不匹配零個字?符的情況,如果要指定范圍使用{n,m}來指定,如查找一位或2位數值的行:
[root@Zabbix_server?~]#?egrep?--color=auto?'\<[0-9]{1,3}[[:space:]]'?/proc/meminfo? [root@Zabbix_server?~]#?egrep?--color=auto?'\<[0-9]{3}[[:space:]]'?/proc/meminfo? [root@Zabbix_server?~]#?egrep?--color=auto?'\<[0-9]+[[:space:]]'?/proc/meminfo| 表示或關系
例如egrep 'abc|def' /proc/meminfo ?查找abc或者def
分組
例如 egrep 'abc|def' /proc/meminfo ?查找abc或者def
? ? ? ?egrep 'ab(c|d)ef' /proc/meminfo ?查找abcef或者abdef? ? ??
[root@Zabbix_server?home]#?egrep?'abc|def'?12.txt?--color=auto abc abcdef abcef abdef [root@Zabbix_server?home]#?egrep?'ab(c|d)ef'?12.txt?--color=auto abcef abdef [root@Zabbix_server?home]#問號“?”:基本正則表達式中表示匹配其前的字符出現0次或1次數。只做次數匹配,不做字符匹配
[root@justin?~]#?echo?"google"?>?/home/grep/grep1/a.txt [root@justin?~]#?echo?"goooooooooooooogle"?>>?/home/grep/grep1/a.txt [root@justin?~]#?grep?'g..gle'?/home/grep/grep1/a.txt google [root@justin?~]#?grep?'g*gle'?/home/grep/grep1/a.txt google goooooooooooooogle [root@justin?~]#?grep?'g.gle'?/home/grep/grep1/a.txt [root@justin?~]#
如果想查找兩個字符之間任意個字符的條件,可以通過小數點和星號一起來匹配,如查找前尾分別為gr和g的行
[root@justin?~]#?grep?'gr.*g'?/home/grep/grep1/a.txt
字符范圍\{m,n \}:限制前一個字符重復出現最少m次,最多n次數
因為 { 與 } 的符號在 shell 是有特殊意義的,因此必須要使用字符 ? \ 來讓他失去特殊意義
\{m,\} 表示至少m次,
\{0,n\} 表示最多n次,不能使用\{,n\}
\{m\} ? 表示只出現m次
() 將候選的所有元素放在()內,用|隔開
????????"a(1|2|3)bc"滿足的例子a1bc、mba3bcd
如果要以組的形式匹配,例如xaby 要匹配ab組合出現多次可以使用\(\)來匹配,例如x\(ab\)*y,表示xy中間中ab出現0次或n次
前向引用
例如要匹配love和lover、like和liker同時所在行
[root@Zabbix_server?home]#?grep?'\(l..e\).*\1r'?1.txt? He?love?his?lover. She?like?her?liker. [root@Zabbix_server?home]#這里\1表示匹配第一個左括號內l..e相同的內容,\(l\(..\)e\).*\2r表示匹配\(..\)這個內..相同的內容,以此類推
查找出現兩個o的行:
[root@justin?~]#?cat?/home/grep/grep1/a.txt "Open?Source"?is?a?good?mechanism?to?develop?programs. apple?is?my?favorite?food. Football?game?is?not?use?feet?only. Oh!?The?soup?taste?good. google?is?the?best?tools?for?search?ke goooooogle?yes! [root@justin?~]#?grep?'o\{2\}'?/home/grep/grep1/a.txt "Open?Source"?is?a?good?mechanism?to?develop?programs. apple?is?my?favorite?food. Football?game?is?not?use?feet?only. Oh!?The?soup?taste?good. google?is?the?best?tools?for?search?ke goooooogle?yes! [root@justin?~]#
查找g后面出現2到5次o,然后緊跟g的行:
[root@justin?~]#?grep?'go\{2,5\}g'?/home/grep/grep1/a.txt google?is?the?best?tools?for?search?ke [root@justin?~]#
查找g后面出現兩次以上o后面跟g的行:
[root@justin?~]#?grep?'go\{2,\}g'?/home/grep/grep1/a.txt google?is?the?best?tools?for?search?ke goooooogle?yes! [root@justin?~]#?grep?'go*g'?/home/grep/grep1/a.txt google?is?the?best?tools?for?search?ke goooooogle?yes! [root@justin?~]#
正則表達式特殊符號
| 字符類 | 代表意義 |
| [:alnum:] | 代表英文大小寫字符及數字,即0-9,A-Z,a-z |
| [:alpha:] | 代表任何英文大小字符,即A-Z,a-z |
| [:lower:] | 代表小寫字符,即a-z |
| [:upper:] | 代表大寫字符,即A-Z |
| [:digit:] | 代表數字,即0-9 |
| [:xdigit:] | 代表十六進制的數字類型,因此包括0-9,A-F,a-f的數字與字符 |
| [:blank:] | 代表空格鍵與tab按鍵 |
| [:graph:] | 除了空格與tab按鍵之外的其它所有按鍵 |
| [:space:] | 任何會產生空白的字符,包括空格鍵,Tab鍵,CR等 |
| [:cntrl:] | 代表鍵盤上面的控制按鍵,既包括CR,LF,Tab,Del等 |
| [:print:] | 代表任意可打印字符 |
| [:punct:] | 代表標點符號,即" ' ? ! ; : # $ |
cat
cat只適合查看內容較短的文件,無法上翻頁,只能顯示、查看一屏內容
tac同上,只是倒敘顯示內容
[root@justin?home]#?cat?test 111 222 333 [root@justin?home]#?tac?test 333 222 111 [root@justin?home]#
more
more適合查看長文件,可以上、下翻頁,按空格鍵下翻一頁,按Enter下翻一行,按b上翻一頁,cat和more可以配合使用
[root@justin?log]#?more?boot.log [root@justin?log]#?cat?boot.log?|more
less
less使用查看長文件,而且可以搜索【關鍵詞】,按N/n查找前后關鍵字
[root@justin?log]#?less?secure Jan?22?10:58:30?justin?sshd[1716]:?Server?listening?on?::?port?22. Jan?22?10:59:12?justin?sshd[1901]:?Accepted?password?for?root?from?10.15.72.73?port?60959?ssh2 Jan?22?10:59:13?justin?sshd[1901]:?pam_unix(sshd:session):?session?opened?for?user?root?by?(uid=0) Jan?22?10:59:13?justin?sshd[1901]:?subsystem?request?for?sftp /port?22
head
查看文件頭N行數據,默認頭10,通過-n指定查看行數;
[root@justin?log]#?head?-n?2?secure Nov?13?17:31:16?localhost?sshd[1582]:?Server?listening?on?0.0.0.0?port?22. Nov?13?17:31:16?localhost?sshd[1582]:?Server?listening?on?::?port?22. [root@justin?log]#tail
查看文件末尾n行,用法同上;參數-f動態實時
[root@justin?log]#?tail?-n?2?secure?-f [root@justin?log]#?tail?-fn?2?secure
轉載于:https://blog.51cto.com/ityunwei2017/1301078
總結
以上是生活随笔為你收集整理的RHEL6基础之八查找、文件内容查看类命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: avalon 框架
- 下一篇: 2.Strings and Consol