VIMで巨大なファイルを操作する


108

VIMで巨大な(〜2GB)ファイルを開こうとしましたが、窒息しました。実際にファイルを編集する必要はありません。効率的にジャンプしてください。

VIMで非常に大きなファイルを操作するにはどうすればよいですか?



5
Vimはあなたが:set binary最初であれば大丈夫です...
ephemient

1
これは新しいfuseファイルシステムの良いターゲットです!splitfsまたはそのようなもの...私はそれに夢中です!
ロドリゴ

1
遅すぎる...これはすでに存在します:sourceforge.net/projects/joinsplitfs
rodrigo

5
編集者ではなく、ポケットベルが必要です!以下のジムの答えを見てください。
レスター・チャン

回答:


85

今日編集する12GBのファイルがありました。vim LargeFileプラグインが機能しませんでした。それでも私のメモリをすべて使い果たしてエラーメッセージが表示されました:-(

ファイルを分割し、パーツを編集してから、再結合します。ただし、2倍のディスク容量が必要です。

  • 編集したい行を囲む何かの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

A Freshmeatのは「大きなファイル」の検索は、2人の編集者は特に、あなたのニーズに適していることを示唆しています。

1つは次のようになります:lfhex ...(Qtに依存する)大きなファイルの16進エディター。これは明らかに、GUIを使用する必要があります。

別のものはコンソールの使用に適しているようです:hed ...と同様のvimインターフェース(exモードを含む?)があると主張しています。

Linux / UNIXで他のエディタを使用して、全体をメモリに読み込まずにファイルをページスルーできることは確かにあります。しかし、私は彼らの名前を思い出せません。私はこの応答を「wiki」エントリにして、他の人にそのような編集者へのリンクを追加するように促しています。(はい、私が使用して問題を回避する方法に精通していますsplitcat、それを省略し、このようなアプローチが伴うことを私たちに時間/待機時間とディスクスペースのオーバーヘッドを保存することができ、特にコンソール/呪いの編集者が、私は編集者と思っています) 。


23

実際にファイルを編集する必要はないので:

  1. view(またはvim -R)は、大きなファイルでも適度に機能するはずです。
  2. または、moreまたはless

「チョーク」とは、開くのにしばらく時間がかかるという意味ですか?または実際にクラッシュしますか?最近ではないLinuxボックスで2.7GBのファイルを開くのに4分以上かかりますview(試して時間を計っただけです)。確かに、それはすぐにできるわけではありませんが、機能します。
ChssPly76、2009年

うん、失速する。私が待っていれば、いつかはそれが開くと確信しています。それがすぐに開き、ナビゲーションに慣れているので、私は少ないと行ってきました。
宝珠

9

私は、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内のこれらの行は保存された行で自動的に上書きされます。


3

私も同じ問題を抱えていましたが、300GBのmysqlダンプであり、を削除してDROPに変更CREATE TABLEしたかったため、のCREATE TABLE IF NOT EXISTS2回の呼び出しを実行したくありませんでした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 2015

1

emacsは100メガバイト単位のファイルで非常にうまく機能します。あまり問題なくログファイルで使用しました。

しかし、一般的に、ある種の分析タスクがある場合は、Perlスクリプトを作成する方が良いと思います。


0

古いスレッド。しかし、それでも(しゃれ:))。

 $less filename

編集せずに見回すだけの場合、効率が悪くなります。これは、巨大なログファイルを調べる場合に当てはまります。

viのような少ない作業で検索

最良の部分は、ほとんどのディストリビューションでデフォルトで利用可能です。したがって、本番環境でも問題にはなりません。


PITAであることが証明されていない650MBのテキストファイルを検索する。LargeFileでvimを使用すると、魅力のように動作します。
MariusCC 2015

2
@MariusCC次に、2 GBを超えるファイルで作業していないと、クラッシュによって魅力が失われます。
ディープダイブ2015

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.