我正在研究一个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 number
xargs 选项按块运行 grep数字文件。
答案3
你有 perl 吗?
答案4
除了添加“-name '*.log'”之外,还尝试将 -n1 添加到 xargs。
也许你的古老 grep 无法接受多个输入文件,因此 -n1 将对每个文件运行 grep,而不是一次将它们作为参数传递