2011-11-01 25 views
4

我的問題分兩部分:爲什麼grep在針對/目錄運行時掛起?

1)爲什麼grep在grep「/」下的所有文件時掛起?

例如:

grep -r 'h' ./ 

(注:掛起/崩潰前吧,我注意到,我看到一些「沒有這樣的設備或地址」的消息,對於插座....

中當然,我知道grep不應該針對套接字運行,但是我會認爲,因爲套接字只是Unix中的文件,它應該返回一個負面結果,而不是崩潰。

2)現在,我的後續問題:無論如何 - 我怎麼能grep整個文件系統?在做這件事情時,我們應該忽略哪些* NIX目錄?特別是,我正在尋找所有最近寫入的日誌文件。

+0

grep不掛起,你的-r表示遞歸系統上的所有文件。那幾千兆字節?另外,所有NFS掛載的文件都以網絡連接速度進行處理,而不是直接連接到CPU的磁盤上的本地文件。這將需要很長時間。祝你好運。 – shellter

回答

1

如果您不斷看到錯誤消息,則grep不會掛起。請在第二個窗口中打開iotop,以查看您的系統是如何努力將其存儲介質上的內容逐件拉入主存儲器的全部。這個操作應該很慢,或者你有一個非常準系統。

現在,我的後續問題:無論如何 - 我怎麼能grep整個文件系統?在做這件事情時,我們應該忽略哪些* NIX目錄?特別是,我尋找所有最近寫的日誌文件。

抹掉整個FS很少是一個好主意。嘗試刷新日誌文件應該寫入的目錄;可能/var/log。更好的是,如果你知道任何關於你正在查找的文件的名字(比如他們的擴展名爲.log),那麼請執行這些程序報告的文件findlocategrep

+0

iotop?我嘗試sudo yum安裝iotop並失敗。 ? – jayunit100

+0

@ jayunit100:http://www.ndchost.com/wiki/server-administration/installing-iotop-centos5 –

8

默認情況下,grep會嘗試讀取每個文件。使用-D skip跳過設備文件,套接字文件和FIFO文件。

13

正如@ninjalj所說,如果你不使用-D skipgrep會嘗試讀取你所有的設備文件,套接字文件和FIFO文件。特別是在Linux系統(和許多Unix系統)上,它會嘗試讀取/dev/zero,這似乎是無限長的。

你會等待一段時間。

如果您正在查找系統日誌,從/var/log開始可能是最好的方法。

如果你正在尋找的東西,真的可以在文件系統中的任何地方,你可以做這樣的事情:

find/-xdev -type f -print0 | xargs -0 grep -H pattern 

-xdev參數find告訴它留一個單一的文件系統中;這將避免/proc/dev(以及任何已安裝的文件系統)。 -type f將搜索限制爲普通文件。-print0打印由空字符而不是換行符分隔的文件名;這避免了在名稱中具有空格或其他有趣字符的文件的問題。

xargs從其標準輸入中讀取文件名(或其他)的列表,並在列表中的所有內容上調用指定的命令。 -0選項與find-print0一起使用。

-H選項指示grep指示它將每個匹配與文件名前綴對齊。默認情況下,grep只有在其命令行上有兩個或更多文件名時纔會執行此操作。由於xargs將其參數分成批次,所以最後一批可能只有一個文件,這會給你不一致的結果。

考慮使用find ... -name '*.log'限制搜索到的文件與.log結尾的名稱(假設你的日誌文件有這樣的名字),和/或使用grep -I ...跳過二進制文件。

請注意,所有這些都取決於GNU特有的功能。其中一些選項可能不適用於MacOS(基於BSD)或其他Unix系統。請查閱您的本地文檔,並考慮安裝GNU findutils(用於findxargs)和/或GNU grep。

在嘗試這些之前,請使用df來查看根文件系統有多大。我的目前268千兆字節;搜索它可能需要幾個小時。花費幾分鐘(a)限制你搜索的文件和(b)確保命令是正確的將是非常值得你花費的時間。

+2

這比xargs更快:'find/-xdev -type f -exec grep -H {} +'。 – MichalH

相關問題