![大分区上出现“grep:内存耗尽”错误](https://linux22.com/image/66888/%E5%A4%A7%E5%88%86%E5%8C%BA%E4%B8%8A%E5%87%BA%E7%8E%B0%E2%80%9Cgrep%EF%BC%9A%E5%86%85%E5%AD%98%E8%80%97%E5%B0%BD%E2%80%9D%E9%94%99%E8%AF%AF.png)
我正在用我的 Linux 命令笔记编辑一个文本文件,这时我发现其中有很大一部分丢失了(可能是复制而没有粘贴)。问题是我已经保存了文档。 (这是一个简单的编辑器,因此没有隐藏副本)
现在我发现了一些博客文章(尤其是这个例如),它展示了如何使用 grep 轻松地在分区中搜索文本字符串:
$ sudo grep -a -C100 'sudo lshw -c' /dev/sdb2 > file.txt
但过了一会儿我明白了:
grep: memory exhausted
我的理解是从这个答案它是关于grep
读取比内存大的行,所以我想我需要类似的代码,但没有find
.
它是 3 TB 硬盘上的 2 TB NTFS 分区。
答案1
grep 程序一次将一行读入内存。一行被定义为一个换行符之后到下一个换行符的所有内容。对于二进制数据,可能会有很大的空间而没有任何换行符。
你可以尝试使用grep -z
.这告诉 grep 将空字节视为输入记录分隔符而不是换行符。极大的二进制数据块不包含空字节的可能性比不包含换行符的可能性要低。实际上,最有可能没有换行符的数据块是磁盘上尚未写入的区域中的一长串空字节。不包含空字节的大量文本数据可能不会大到耗尽内存。另一个好处grep -z
是输出将包含整个文本块(通常为 1-4kB),而不仅仅是一行。
您可以尝试使用专用实用程序来代替 grep,例如摄影记录(部分测试盘)。尽管有这个名字,但它并不局限于照片。这些实用程序知道文件系统结构,因此它们有时可以恢复跨越多个非连续块的已删除文件。
当然,永远不能保证您能够恢复旧数据。它可能已被覆盖。