在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的其他编辑器,它们能够遍历文件而不会将整个文件加载到内存中。 但是,我不记得他们的名字。 我将这个回复作为“维基”条目,以鼓励其他人将他们的链接添加到这些编辑。 (是的,我熟悉使用splitcat解决这个问题的方法;但是我正在考虑编辑器,特别是控制台/诅咒编辑器,它们可以省却这些,并节省了时间/延迟和磁盘空间的开销,意味着)。

由于您不需要实际编辑文件:

  1. view (或者vim -R )在大文件上应该可以很好地工作。
  2. 或者你可以使用moreless

我写了一个基于弗洛里安的答案,使用纳米(我最喜欢的编辑)的一个小脚本:

 #!/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。

对于巨大的单线(从199打印字符):

 cut -c 1-99 filename 

老线程。 但是(双关:))。

  $less filename 

如果您不想编辑,只需要查看哪些是检查大型日志文件的情况,就不会有效地工作。

search更less的作品,如六

最好的部分,它在大多数发行版上默认是可用的。 所以也不会成为生产环境的问题。

这是旧的,但使用nano,vim或gvim