VIMで巨大な(〜2GB)ファイルを開いてみましたが、それが窒息しました。実際にファイルを編集する必要はありません。効率的にジャンプするだけです。
VIMで非常に大きなファイルを操作するにはどうすればよいですか?
今日編集する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.new
が編集済みファイルになります。元のHUGEFILE
を削除できます。
これは長年にわたって繰り返し発生する問題でした。 (数値は変化し続けていますが、概念は同じです。メモリより大きいファイルを表示または編集するにはどうすればよいですか?)
明らかにmore
またはless
は、単にファイルを読み取るための優れたアプローチです--- less
は、スクロールと検索のためのvi
のようなキーバインドも提供します。
「大きなファイル」での Freshmeat 検索は、2人のエディターがあなたのニーズに特に適していることを示唆しています。
1つは: lfhex ...大きなファイルの16進エディタ(Qtに依存)です。それは、明らかに、GUIの使用を必要とします。
別のものはコンソールの使用に適しているようです: hed ...そして、vim
のようなインターフェース(ex
モードを含む?).
私は、ファイル全体をメモリにロードせずにファイルをページングできるLinux/UNIXの他のエディターを見たことがあると思います。しかし、私は彼らの名前を思い出しません。他の人がそのような編集者にリンクを追加することを奨励するために、この応答を「wiki」エントリにします。 (はい、私はsplit
とcat
を使用して問題を回避する方法に精通していますが、私はエディタ、特にそれを省き、時間/レイテンシとそのようなアプローチのディスクスペースのオーバーヘッドを節約できるコンソール/カーソルエディタを考えています伴う)。
フロリアンの答えに基づいて、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内のこれらの行は保存された行で自動的に上書きされます。
巨大なワンライナーの場合(1
から99
までの文字を印刷します):
cut -c 1-99 filename
私は同じ問題を抱えていましたが、それは300GBのmysqlダンプであり、DROP
を削除してCREATE TABLE
をCREATE 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
すでに遅れていますが、ファイルを編集せずにナビゲートしたいだけであれば、cat
でもできます。
% cat filename | less
または、代わりにシンプル:
% less filename
emacsは数百メガバイトのファイルで非常にうまく機能します。私はこれをログファイルであまり問題なく使用しました。
しかし一般的に、何らかの種類の分析タスクがある場合、Perlスクリプトを作成する方が適しています。
古いスレッド。ただし、それでも(pun :))。
$less filename
編集したくない場合は、lessは効率的に機能し、巨大なログファイルを調べる場合にのみ機能します。
Viのように少ない作品で検索
最良の部分は、ほとんどのディストリビューションでデフォルトで利用可能です。したがって、実稼働環境でも問題になりません。