如何在旧版本的 grep 中重现 grep 的 --recursive 选项

如何在旧版本的 grep 中重现 grep 的 --recursive 选项

我正在研究一个grep缺少 -r/--recursive 选项的古老 UNIX。

我需要找到应用程序导致的错误,但我不知道应用程序将错误写入哪个日志文件。但是,我知道日志文件位于 中的某个位置/opt。所以我想/opt在 下找到 FooErrorMessage *.log。以下是我尝试的方法:

find /opt | xargs grep FooErrorMessage

——但是这不起作用,而且我不知道在哪里指定我只想要*.log命令中的文件。

答案1

您只是想找到下面的所有日志文件/opt并搜索它们,somethnig_I_am_looking_for对吗?为什么不呢:

find /opt -name '*.log' | xargs grep something

或者

find /opt | grep .log | xargs grep something

哦,因为我不知道如何评论其他答案:小心使用 *.log,因为 shell 会将其解释为通配符,并匹配当前目录中以 结尾的所有文件.log。您应该使用 \*.log 或 '*.log'

答案2

请注意文件名中含有空格,因为这是 Unix 允许的;xargs 会阻止它们。使用find /opt -name '*.log' ... -print0 | xargs -0 grep ...,这些选项应该一起使用。

此外,grep 或 shell 的参数数量可能有限,find 返回的文件列表可能超出该数量。使用-n numberxargs 选项按块运行 grep数字文件。

答案3

你有 perl 吗?

尝试 - http://betterthangrep.com/

答案4

除了添加“-name '*.log'”之外,还尝试将 -n1 添加到 xargs。

也许你的古老 grep 无法接受多个输入文件,因此 -n1 将对每个文件运行 grep,而不是一次将它们作为参数传递

相关内容