我正在研究一个古老的UNIX,它的grep缺less-r / – recursion选项。
我需要find我们的应用程序正在造成的错误,但我不知道我们的应用程序正在写错误的日志文件。 但是,我知道日志文件位于/opt 。 所以我想在*.log下的/opt下findFooErrorMessage。 这是我的尝试:
find /opt | xargs grep FooErrorMessage
– 但这不起作用,我不知道在哪里指定,我只是想在命令*.log文件。
你只是想find/opt下的所有日志文件,并searchsomethnig_I_am_looking_for右边? 为什么不:
find /opt -name '*.log' | xargs grep something
要么
find /opt | grep .log | xargs grep something
?
哦,因为我不知道如何评论其他答案:小心* .log作为shell将解释为globbing,并匹配在当前目录中以.log结尾的所有文件。 您应该使用\ *。log或'* .log'
小心文件名中包含空格,这是Unix允许的。 xargs会窒息他们。 使用find /opt -name '*.log' ... -print0 | xargs -0 grep ... find /opt -name '*.log' ... -print0 | xargs -0 grep ... ,这些选项是为了一起去。
而且,grep或shell可能只有有限的参数,find返回的文件列表可能会超过这个参数。 使用xargs的-n number选项来通过数字文件块运行grep。
你有perl吗?
find /opt -type f -name *.log -print | xargs grep 'something_I_am_looking_for'
除了添加“-name”* .log“”之外,尝试在xargs中添加-n1。
也许你的古老的grep不能接受多个input文件,所以-n1将为每个文件运行grep,而不是一次传递它们作为参数
你也可以用exec选项来代替xargs
find/ opt -exec grep“你正在寻找的东西”{} \;
GNU grep有它自己的“recursion”选项:
grep -R foo /path/to/directory
要grep特定模式的文件,最好用find和xargs :
find /path/to/directory -name \*.log -print0 | xargs -0 grep foo
find /opt -name *.log | xargs grep yourstring
除非你有深层次的子目录,否则grep *,grep /和grep / *很容易记住,难以input错误。