我的任务是编写一个shell脚本来grep浏览Linux和Solaris服务器上许多目录中的数百个日志文件。有些日志以多种格式压缩,有些日志的大小只有几 GB。我担心 grep 在服务器上使用大量资源,并可能通过耗尽内存来关闭机器上运行的 Web 服务器(如果这可能会发生)。
我应该解压缩文件,grep 它们,然后再次压缩它们,还是使用 zgrep(或等效的)在压缩时搜索它们?使用一种方法比另一种方法在资源方面是否有优势?
另外,有没有一种简单的方法可以将命令的内存使用量限制为当前可用内存的百分比?
如果有人可以在运行这些命令时解释内存使用情况的工作原理,那将有很大帮助。
grep
内存使用量是恒定的;它不随文件大小而缩放†。它不需要将整个文件保存在内存中,只需要将它正在搜索的区域保留在内存中。
减压也是类似的。内存使用量与字典大小成正比,而不是与文件总大小成正比。字典大小没什么可担心的:最多几兆字节。
我不会担心一些简单的grep
/zgrep
/zcat | grep
搜索会关闭其他进程。这些东西是Linux的面包和黄油。
† 不过,要小心扫描排长线的文件。它的内存使用量确实与行长成比例。您可以使用grep -I
跳过二进制文件,这通常就足够了。