web-dev-qa-db-ja.com

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

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

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

106
hoju

今日編集する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を削除できます。

84
Florian

これは長年にわたって繰り返し発生する問題でした。 (数値は変化し続けていますが、概念は同じです。メモリより大きいファイルを表示または編集するにはどうすればよいですか?)

明らかにmoreまたはlessは、単にファイルを読み取るための優れたアプローチです--- lessは、スクロールと検索のためのviのようなキーバインドも提供します。

「大きなファイル」での Freshmeat 検索は、2人のエディターがあなたのニーズに特に適していることを示唆しています。

1つは: lfhex ...大きなファイルの16進エディタ(Qtに依存)です。それは、明らかに、GUIの使用を必要とします。

別のものはコンソールの使用に適しているようです: hed ...そして、vimのようなインターフェース(exモードを含む?).

私は、ファイル全体をメモリにロードせずにファイルをページングできるLinux/UNIXの他のエディターを見たことがあると思います。しかし、私は彼らの名前を思い出しません。他の人がそのような編集者にリンクを追加することを奨励するために、この応答を「wiki」エントリにします。 (はい、私はsplitcatを使用して問題を回避する方法に精通していますが、私はエディタ、特にそれを省き、時間/レイテンシとそのようなアプローチのディスクスペースのオーバーヘッドを節約できるコンソール/カーソルエディタを考えています伴う)。

30
Jim Dennis

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

  1. view(またはvim -R)は、大きなファイルでもかなりうまく機能するはずです。
  2. または、 more または less を使用できます
21
ChssPly76

フロリアンの答えに基づいて、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内のこれらの行は保存された行で自動的に上書きされます。

8
B T

巨大なワンライナーの場合(1から99までの文字を印刷します):

cut -c 1-99 filename
3
DmitrySandalov

私は同じ問題を抱えていましたが、それは300GBのmysqlダンプであり、DROPを削除してCREATE TABLECREATE TABLE IF NOT EXISTSに変更したかったので、sedを2回呼び出したくありませんでした。これらの変更をファイルにコピーするために、この簡単な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
3
Steeve McCauley

すでに遅れていますが、ファイルを編集せずにナビゲートしたいだけであれば、catでもできます。

% cat filename | less

または、代わりにシンプル:

% less filename
2
chepukha

emacsは数百メガバイトのファイルで非常にうまく機能します。私はこれをログファイルであまり問題なく使用しました。

しかし一般的に、何らかの種類の分析タスクがある場合、Perlスクリプトを作成する方が適しています。

1
Andy Ross

古いスレッド。ただし、それでも(pun :))。

 $less filename

編集したくない場合は、lessは効率的に機能し、巨大なログファイルを調べる場合にのみ機能します。

Viのように少ない作品で検索

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

0
deepdive