2017-08-28 54 views
0

我需要在整個Linux文件系統中找到一個字符串,並使用grep在文件系統中查找此字符串的所有實例。我得到了兩種結果:一種來自我的/.bash_history,另一組來自proc目錄。很明顯,答案在於某種過程。讀取/ proc中的虛擬文件內容

/proc結果看起來是這樣的:

Binary file /proc/12345/task/12345/cmdline matches 

當我嘗試導航到目錄12345,它不存在。我在redhat手冊中讀過/ proc文件系統中的文件往往是虛擬的。我猜測這個過程可能在grep完成搜索的時候結束了,我導航到了相應的目錄。 有沒有一種方法可以在與grep相同的命令中打印進程的內容?在這種情況下,它返回兩個結果。我如何閱讀每個結果的內容? 謝謝!

編輯:我以前grep -rs "*string_name*" /來查找字符串

+1

通常,您不想跨越文件系統邊界。由於'grep -r'不能執行此操作,請改用'find/-xdev -type f -exec grep somestring {} +'。還要注意,盲目使用'grep -a'可能會弄亂你的終端。 – o11c

+0

'{}'和'+'是什麼意思? – tinkuge

+0

'{}'表示「替換爲找到的任何文件」找到「。 '+'是exec所特有的,意思是「exec與多個文件在一起」,而'''表示「exec每個文件一次」 - 在可能的情況下,通常應該使用'+',因爲'fork + exec'相對較貴。 – o11c

回答

2

我猜這個過程可能已經結束

正確:這是你的grep進程相匹配。

當你grep正在運行,在命令行文件看起來是這樣的:

grep^@-r^@string^@/^@ 

這裏的「滑稽」字符的字符NUL分離的參數。

有沒有辦法在與grep相同的命令中打印進程的內容?

man grep,它看起來像加-a命令行會打印二進制文件,就好像它是文本(grep認爲cmdline是一個二進制文件,因爲它包含嵌入NUL S)。

+0

所以,這不完全匹配?它只是鏡像命令行的內容? – tinkuge

+0

「它不完全匹配」 - 是的它是:它是一個包含你的字符串的文件(憑藉你的字符串是一個命令行參數)。這不是你關心的比賽,但它*是*比賽。一般來說,你可能不關心'/ proc'下的任何文件,因爲它們都是短暫的。 –

+0

我也猜測'.bash_history'就是一樣無關緊要嗎?在這種情況下,grep沒有返回任何匹配我正在尋找。我使用了'grep -rs「* string_name *」\'這些似乎是唯一的結果。 – tinkuge