在VIM中处理大量文件
我试图在VIM中打开一个巨大的(〜2GB)文件,但它窒息。 我实际上不需要编辑文件,只是有效地跳转。
我怎样才能在VIM中处理非常大的文件?
我今天有一个12GB的文件要编辑。 vim的LargeFile插件没有为我工作。 它仍然用完了我所有的内存,然后打印出一个错误信息:-(我无法使用hexedit,因为它不能插入任何东西,只是覆盖。这是一种替代方法:
您分割文件,编辑部分,然后重新组合。 尽pipe如此,您仍然需要两倍的磁盘空间。
-
在你想编辑的行的周围inputgrep:
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(在这种情况下是最前面的3行)之前选取所有的行,将其与编辑的行(在这种情况下是行4和行5)合并,并使用这组合的行来replace在HUGEFILE中相当于(在这种情况下是前5行),并将其全部写入新文件。
HUGEFILE.new
现在将成为您的编辑文件,您可以删除原HUGEFILE
。
多年来这一直是一个反复出现的问题。 (数字不断变化,但概念是一样的:如何查看或编辑比内存大的文件?)
显然, less
是仅仅阅读文件的好方法—甚至less
提供像键盘滚动和search的vi
。
在“大型文件”的Freshmeatsearch表明,两名编辑将特别适合您的需求。
一个是: lfhex …一个大文件hex编辑器(这取决于Qt)。 显然,这需要使用GUI。
另一个似乎适合控制台使用: hed …它声称有一个类似vim
的界面(包括ex
模式?)。
我确定我见过Linux / UNIX的其他编辑器,它们能够遍历文件而不会将整个文件加载到内存中。 但是,我不记得他们的名字。 我将这个回复作为“维基”条目,以鼓励其他人将他们的链接添加到这些编辑。 (是的,我熟悉使用split
和cat
解决这个问题的方法;但是我正在考虑编辑器,特别是控制台/诅咒编辑器,它们可以省却这些,并节省了时间/延迟和磁盘空间的开销,意味着)。
由于您不需要实际编辑文件:
-
view
(或者vim -R
)在大文件上应该可以很好地工作。 - 或者你可以使用
more
或less
我写了一个基于弗洛里安的答案,使用纳米(我最喜欢的编辑)的一个小脚本:
#!/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行,可以编辑它们,当你保存并退出时,巨大文件中的那些行将被你保存的行自动覆盖。
现在已经很晚了,但是如果你只是想浏览文件而不进行编辑, cat
也可以完成这项工作。
% cat filename | less
或者简单地说:
% less filename
我有同样的问题,但它是一个300GB的MySQL转储,我想摆脱DROP
并将CREATE TABLE
更改为CREATE TABLE IF NOT EXISTS
所以不想运行两个sed
调用。 我写了这个快速的Ruby脚本,用这些改变来debugging文件:
#!/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
emacs可以很好的处理文件到100兆字节,我已经在日志文件中使用了它,没有太多的麻烦。
但是通常当我有某种分析任务的时候,我觉得写一个perl脚本是一个更好的select。
对于巨大的单线(从1
到99
打印字符):
cut -c 1-99 filename
老线程。 但是(双关:))。
$less filename
如果您不想编辑,只需要查看哪些是检查大型日志文件的情况,就不会有效地工作。
search更less的作品,如六
最好的部分,它在大多数发行版上默认是可用的。 所以也不会成为生产环境的问题。
这是旧的,但使用nano,vim或gvim