Saya mencoba membuka file besar (~ 2GB) di VIM tetapi tersedak. Saya sebenarnya tidak perlu mengedit file, hanya melompat-lompat secara efisien.
Bagaimana saya bisa bekerja dengan file yang sangat besar di VIM?
:set binary
pertama kali ...
Saya mencoba membuka file besar (~ 2GB) di VIM tetapi tersedak. Saya sebenarnya tidak perlu mengedit file, hanya melompat-lompat secara efisien.
Bagaimana saya bisa bekerja dengan file yang sangat besar di VIM?
:set binary
pertama kali ...
Jawaban:
Saya memiliki file 12GB untuk diedit hari ini. Plugin vim LargeFile tidak bekerja untuk saya. Itu masih menggunakan semua memori saya dan kemudian mencetak pesan kesalahan :-(. Saya juga tidak dapat menggunakan hexedit, karena tidak dapat memasukkan apa pun, cukup timpa. Berikut adalah pendekatan alternatif:
Anda membagi file, mengedit bagian-bagian dan kemudian menggabungkannya kembali. Anda masih membutuhkan ruang disk dua kali lipat.
Grep untuk sesuatu yang mengelilingi baris yang ingin Anda edit:
grep -n 'something' HUGEFILE | head -n 1
Ekstrak rentang file tersebut. Katakanlah baris yang ingin Anda edit berada di baris 4 dan 5. Kemudian lakukan:
sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
-n
opsi diperlukan untuk menekan perilaku default sed untuk mencetak segala sesuatu4,5p
mencetak baris 4 dan 55q
membatalkan sed setelah jalur pemrosesan 5 Edit SMALLPART
menggunakan editor favorit Anda.
Gabungkan file:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
sekarang akan menjadi file yang Anda edit, Anda dapat menghapus aslinya HUGEFILE
.
Ini telah menjadi pertanyaan yang berulang selama bertahun-tahun. (Angka terus berubah, tetapi konsepnya sama: bagaimana cara melihat atau mengedit file yang lebih besar dari memori?)
Jelas more
atau less
merupakan pendekatan yang baik untuk sekadar membaca file --- less
bahkan menawarkan vi
seperti keybindings untuk menggulir dan mencari.
Sebuah Freshmeat pencarian di "file besar" menunjukkan bahwa dua editor akan sangat cocok dengan kebutuhan Anda.
Salah satunya adalah: lfhex ... editor hex file besar (yang bergantung pada Qt). Yang itu, jelas, memerlukan penggunaan GUI.
Yang lain tampaknya cocok untuk penggunaan konsol: hed ... dan mengklaim memiliki vim
antarmuka -seperti (termasuk ex
mode?).
Saya yakin saya pernah melihat editor lain untuk Linux / UNIX yang dapat membuka halaman melalui file tanpa memuat keseluruhannya ke dalam memori. Namun, saya tidak ingat nama mereka. Saya membuat tanggapan ini sebagai entri "wiki" untuk mendorong orang lain menambahkan tautan mereka ke editor semacam itu. (Ya, saya akrab dengan cara untuk mengatasi masalah menggunakan split
dan cat
; tapi saya memikirkan editor, terutama editor konsol / kutukan yang dapat membuangnya dan menghemat waktu / latensi dan overhead ruang disk yang diperlukan oleh pendekatan semacam itu) .
Karena Anda tidak perlu benar-benar mengedit file:
view
(baru dicoba dan waktunya). Memang, itu tidak instan, tapi berhasil.
Saya menulis skrip kecil berdasarkan jawaban Florian yang menggunakan nano (editor favorit saya):
#!/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
Gunakan seperti ini:
sh hfnano yourHugeFile 3 8
Dalam contoh itu, nano akan membuka baris 3 hingga 8, Anda dapat mengeditnya, dan ketika Anda menyimpan dan keluar, baris-baris di hugefile akan secara otomatis ditimpa dengan baris yang Anda simpan.
Aku punya masalah yang sama, tapi itu adalah mysql sampah 300GB dan saya ingin menyingkirkan DROP
dan perubahan CREATE TABLE
untuk CREATE TABLE IF NOT EXISTS
jadi tidak ingin menjalankan dua doa dari sed
. Saya menulis skrip Ruby cepat ini untuk menipu file dengan perubahan itu:
#!/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
}
Dipanggil seperti
./mreplace.rb < foo.sql > foo_two.sql
chmod +x mreplace.rb
dulu, Anda juga bisaruby mreplace.rb ..
Untuk satu baris besar (mencetak karakter dari 1
ke 99
):
cut -c 1-99 filename
Ini sudah terlambat tetapi jika Anda hanya ingin menavigasi file tanpa mengeditnya, Anda juga cat
dapat melakukan pekerjaan itu.
% cat filename | less
atau alternatif sederhana:
% less filename
cat
meningingkan file terlebih dahulu adalah tindakan bodoh yang gila-gilaan, karena itu berarti file tersebut akan sepenuhnya berada dalam memori (sehingga less
dapat mencari file tersebut) atau tidak dapat dicari sama sekali; cat
hanya memberikan aliran keluaran statis.
Benang tua. Namun demikian (permainan kata :)).
$less filename
kurang berfungsi secara efisien jika Anda tidak ingin mengedit dan hanya melihat-lihat yang merupakan kasus untuk memeriksa file log yang besar.
Cari di lebih sedikit karya seperti vi
Bagian terbaiknya, ini tersedia secara default di sebagian besar distro. Jadi tidak akan menjadi masalah untuk lingkungan produksi juga.
ini sudah tua tapi, gunakan nano, vim atau gvim