我尝试在 VIM 中打开一个巨大的(~2GB)文件,但它卡住了。我实际上不需要编辑文件,只需有效地跳转即可。
如何在 VIM 中处理非常大的文件?
我今天有一个 12GB 的文件要编辑。vim LargeFile 插件对我不起作用。它仍然用尽了我所有的内存,然后打印了一条错误消息:-(。我也不能使用 hexedit,因为它不能插入任何东西,只能覆盖。这是另一种方法:
您拆分文件,编辑部分,然后重新组合它。不过,您仍然需要两倍的磁盘空间。
Grep 查找您要编辑的行周围的内容:
grep -n 'something' HUGEFILE | head -n 1
提取该文件的范围。假设您要编辑的行位于第 4 行和第 5 行。然后执行以下操作:
sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
-n
选项来抑制 sed 打印所有内容的默认行为4,5p
打印第 4 行和第 5 行5q
在处理第 5 行后中止 sedSMALLPART
使用您最喜欢的编辑器进行编辑。
合并文件:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
现在将是您编辑的文件,您可以删除原始HUGEFILE
.
这是多年来反复出现的问题。(数字不断变化,但概念是一样的:如何查看或编辑大于内存的文件?)
显然more
或者less
是仅仅阅读文件的好方法——less
甚至提供vi
诸如用于滚动和搜索的键绑定。
Freshmeat对“大文件”的搜索表明,有两个编辑器特别适合您的需求。
一种是:lfhex ... 一个大文件十六进制编辑器(取决于 Qt)。显然,这需要使用 GUI。
另一个似乎适合控制台使用:hed ... 它声称具有vim
-like 界面(包括ex
模式?)。
我确信我见过其他 Linux/UNIX 编辑器能够在不将文件全部加载到内存的情况下对文件进行分页。但是,我不记得他们的任何名字。我将此回复设为“wiki”条目,以鼓励其他人将他们的链接添加到此类编辑器。(是的,我熟悉使用split
and解决该问题的方法cat
;但我正在考虑编辑器,尤其是控制台/诅咒编辑器,它们可以省去这种方法并为我们节省时间/延迟和磁盘空间开销) .
我根据 Florian 使用 nano(我最喜欢的编辑器)的回答编写了一个小脚本:
#!/bin/sh
if [ "$#" -ne 3 ]; then
echo "Usage: $0 hugeFilePath startLine endLine" >&2
exit 1
fi
sed -n -e $2','$3'p' -e $3'q' $1 > hfnano_temporary_file
nano hfnano_temporary_file
(head -n `expr $2 - 1` $1; cat hfnano_temporary_file; sed -e '1,'$3'd' $1) > hfnano_temporary_file2
cat hfnano_temporary_file2 > $1
rm hfnano_temporary_file hfnano_temporary_file2
像这样使用它:
sh hfnano yourHugeFile 3 8
在该示例中,nano 将打开第 3 到 8 行,您可以对其进行编辑,当您保存并退出时,hugefile 中的这些行将自动被您保存的行覆盖。
我有同样的问题,但它是一个 300GB 的 mysql 转储,我想摆脱DROP
并更改CREATE TABLE
为CREATE TABLE IF NOT EXISTS
所以不想运行两次调用sed
. 我编写了这个快速的 Ruby 脚本,用这些更改来欺骗文件:
#!/usr/bin/env ruby
matchers={
%q/^CREATE TABLE `foo`/ => %q/CREATE TABLE IF NOT EXISTS `foo`/,
%q/^DROP TABLE IF EXISTS `foo`;.*$/ => "-- DROP TABLE IF EXISTS `foo`;"
}
matchers.each_pair { |m,r|
STDERR.puts "%s: %s" % [ m, r ]
}
STDIN.each { |line|
#STDERR.puts "line=#{line}"
line.chomp!
unless matchers.length == 0
matchers.each_pair { |m,r|
re=/#{m}/
next if line[re].nil?
line.sub!(re,r)
STDERR.puts "Matched: #{m} -> #{r}"
matchers.delete(m)
break
}
end
puts line
}
像这样调用
./mreplace.rb < foo.sql > foo_two.sql
对于巨大的单行字(从1
to打印字符99
):
cut -c 1-99 filename
现在已经很晚了,但是如果您只想浏览文件而不编辑它,cat
也可以完成这项工作。
% cat filename | less
或者简单的:
% less filename
emacs 可以很好地处理 100 兆字节的文件,我在日志文件上使用它没有太多麻烦。
但通常当我有某种分析任务时,我发现编写 perl 脚本是一个更好的选择。
旧线程。但是尽管如此(双关语:))。
$less filename
如果您不想编辑而只是环顾四周,检查巨大的日志文件就是这种情况,那么 less 可以有效地工作。
在较少的作品中搜索 vi
最好的部分,默认情况下它在大多数发行版上都可用。所以生产环境也不会有问题。
这是旧的,但使用 nano、vim 或 gvim