我尝试在VIM中打开一个巨大的(~2GB)文件,但是它很窒息。我实际上并不需要编辑文件,只是有效地跳转。
如何在VIM中处理非常大的文件?
答案 0 :(得分:84)
我今天要编辑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行后取消了sed 使用您喜欢的编辑器编辑SMALLPART
。
合并文件:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
现在将成为您已修改的文件,您可以删除原始HUGEFILE
。
答案 1 :(得分:30)
多年来,这一直是一个反复出现的问题。 (数字不断变化,但概念是一样的:如何查看或编辑大于内存的文件?)
显然more
或less
是仅仅阅读文件的好方法--- less
甚至提供vi
类似于滚动和搜索的键绑定。
对“大文件”的Freshmeat搜索表明,两位编辑将特别适合您的需求。
一个是:lfhex ...一个大文件十六进制编辑器(取决于Qt)。显然,那个需要使用GUI。
另一个似乎适合使用控制台:hed ...它声称有一个类似vim
的界面(包括ex
模式?)。
我确信我已经看到其他Linux / UNIX编辑器能够翻阅文件而无需将其全部内容加载到内存中。但是,我不记得他们的任何名字。我正在将此回复作为“wiki”条目,以鼓励其他人将其链接添加到此类编辑器。 (是的,我熟悉使用split
和cat
来解决问题的方法;但我正在考虑编辑,尤其是控制台/诅咒编辑,它们可以免除这些并节省我们的时间/这种方法所需的延迟和磁盘空间开销。)
答案 2 :(得分:20)
答案 3 :(得分:7)
我根据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中的这些行将自动被您保存的行覆盖。
答案 4 :(得分:3)
我遇到了同样的问题,但这是一个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
答案 5 :(得分:3)
对于巨大的单行(打印从1
到99
的字符):
cut -c 1-99 filename
答案 6 :(得分:2)
现在已经很晚了,但是如果您只想浏览文件而不进行编辑,那么cat
也可以完成这项工作。
% cat filename | less
或者简单:
% less filename
答案 7 :(得分:1)
emacs可以很好地处理100兆字节的文件,我已经在日志文件中使用它而没有太多麻烦。
但通常当我有某种分析任务时,我发现编写一个perl脚本是一个更好的选择。
答案 8 :(得分:0)
旧线程。但不过(双关语:))。
$less filename
如果你不想编辑,只是环顾四周,检查大量日志文件就会有效。
搜索较少的作品,例如vi
最好的部分,它在大多数发行版中默认可用。因此,生产环境也不会成为问题。
答案 9 :(得分:-14)
这是旧的,但是, 使用nano,vim或gvim