在VIM中处理大型文件


108

我试图在VIM中打开一个巨大的文件(〜2GB),但它被阻塞了。我实际上不需要编辑文件,只需高效地跳转即可。

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



5
Vim应该没问题,只要您:set binary第一次...
短暂

1
这是新的保险丝文件系统的理想目标!splitfs之类的东西...我很喜欢!
rodrigo

1
太晚了……这已经存在:sourceforge.net/projects/joinsplitfs
rodrigo

5
您需要传呼机,而不是编辑长官!请参阅下面的吉姆的答案。
Lester Cheung

Answers:


85

我今天有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


30

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

显然more还是less仅读取文件的好方法- less甚至提供了vi诸如滚动和搜索键绑定之类的方法。

一个Freshmeat站点上的“大文件”的搜索表明,两位编辑将特别适合您的需求。

一个可能是:lfhex ...一个大文件的十六进制编辑器(取决于Qt)。显然,该程序需要使用GUI。

另一个似乎适合控制台使用:hed ...,它声称具有类似vim接口(包括ex模式?)。

我确定我已经见过其他Linux / UNIX编辑器,它们能够在不将文件整体加载到内存的情况下进行页面分页。但是,我不记得他们的名字了。我将此回复设为“ wiki”条目,以鼓励其他人将其链接添加到此类编辑器。(是的,我熟悉使用split和来解决该问题的方法,cat但是我正在考虑使用编辑器,尤其是控制台/ curses编辑器,因为它们可以省去该设置,并为我们节省了这种方法所需的时间/延迟和磁盘空间开销) 。


23

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

  1. view(或vim -R)应该可以在大型文件上正常工作。
  2. 或者您可以使用moreless

所谓“窒息”,是指需要一段时间才能打开?还是实际上崩溃了?在我不太新近的Linux机器上,花了4分钟多的时间来打开2.7GB的文件view(只是尝试并定时)。当然,这不是即时的,但确实有效。
2009年

是的,它停了下来。我确定如果我等待,它将最终打开。我花了更少的时间,因为它会立即打开,并且我习惯了导航。
hoju

9

我根据弗洛里安的回答写了一个小脚本,该脚本使用了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行,您可以对其进行编辑,并且在保存并退出时,巨大文件中的这些行将自动被保存的行覆盖。


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

只是要注意运行,要首先将其作为exe运行chmod +x mreplace.rb,您也可以ruby mreplace.rb ..
Smar

感谢@Steeve McCauley!辛苦了 正是我在寻找该问题的答案时正在寻找的东西。
内特·里特


2

已经很晚了,但是如果您只想浏览文件而不编辑它,cat也可以做。

% cat filename | less

或者简单:

% less filename

8
请注意,cat首先对文件进行操作是非常愚蠢的,因为它要么意味着文件将完全在内存中(因此less可以查找文件),要么根本无法查找;cat只是给出静态输出流。
Smar

1

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

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


0

旧线程。但是尽管如此(pun :))。

 $less filename

如果您不想编辑,只需查看一下即可检查大型日志文件,那么less可以有效地工作。

搜索较少的作品,如vi

最好的是,大多数发行版默认提供该功能。因此,对于生产环境也不会出现问题。


用更少的空间搜索650MB文本文件被证明是PITA。在LargeFile中使用vim就像一个魅力。
MariusCC 2015年

2
@MariusCC然后,您使用的GB文件数不会超过2个,崩溃时您的魅力就会消失!
2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.