114

我尝试在 VIM 中打开一个巨大的(~2GB)文件,但它卡住了。我实际上不需要编辑文件,只需有效地跳转即可。

如何在 VIM 中处理非常大的文件?

4

10 回答 10

89

我今天有一个 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 中选择已编辑行之前的所有行(在本例中为前 3 行),将其与已编辑行(在本例中为第 4 行和第 5 行)组合并使用这组组合行替换HUGEFILE 中的等效项(在本例中为前 5 行)并将其全部写入一个新文件。

    HUGEFILE.new现在将是您编辑的文件,您可以删除原始HUGEFILE.

于 2011-07-29T14:26:51.997 回答
31

这是多年来反复出现的问题。(数字不断变化,但概念是一样的:如何查看或编辑大于内存的文件?)

显然more或者less是仅仅阅读文件的好方法——less甚至提供vi诸如用于滚动和搜索的键绑定。

Freshmeat对“大文件”的搜索表明,有两个编辑器特别适合您的需求。

一种是:lfhex ... 一个大文件十六进制编辑器(取决于 Qt)。显然,这需要使用 GUI。

另一个似乎适合控制台使用:hed ... 它声称具有vim-like 界面(包括ex模式?)。

我确信我见过其他 Linux/UNIX 编辑器能够在不将文件全部加载到内存的情况下对文件进行分页。但是,我不记得他们的任何名字。我将此回复设为“wiki”条目,以鼓励其他人将他们的链接添加到此类编辑器。(是的,我熟悉使用splitand解决该问题的方法cat;但我正在考虑编辑器,尤其是控制台/诅咒编辑器,它们可以省去这种方法并为我们节省时间/延迟和磁盘空间开销) .

于 2009-10-20T03:28:01.647 回答
25

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

  1. view(或vim -R)应该在大文件上工作得相当好。
  2. 或者您可以使用moreless
于 2009-10-19T23:48:28.867 回答
10

我根据 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 中的这些行将自动被您保存的行覆盖。

于 2015-03-26T02:08:01.777 回答
3

我有同样的问题,但它是一个 300GB 的 mysql 转储,我想摆脱DROP并更改CREATE TABLECREATE 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
于 2013-02-09T14:59:56.627 回答
3

对于巨大的单行字(从1to打印字符99):

cut -c 1-99 filename
于 2015-12-11T21:23:49.403 回答
1

现在已经很晚了,但是如果您只想浏览文件而不编辑它,cat也可以完成这项工作。

% cat filename | less

或者简单的:

% less filename
于 2012-04-15T19:23:33.300 回答
1

emacs 可以很好地处理 100 兆字节的文件,我在日志文件上使用它没有太多麻烦。

但通常当我有某种分析任务时,我发现编写 perl 脚本是一个更好的选择。

于 2009-10-19T23:42:38.483 回答
0

旧线程。但是尽管如此(双关语:))。

 $less filename

如果您不想编辑而只是环顾四周,检查巨大的日志文件就是这种情况,那么 less 可以有效地工作。

在较少的作品中搜索 vi

最好的部分,默认情况下它在大多数发行版上都可用。所以生产环境也不会有问题。

于 2015-03-31T03:34:13.553 回答
-15

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

于 2012-02-29T07:58:54.033 回答