2017-08-28 51 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