Я спробував відкрити величезний (~ 2 Гб) файл у VIM, але він захлинувся. Мені насправді не потрібно редагувати файл, просто досить ефективно стрибати.
Як я можу розпочати роботу з дуже великими файлами в VIM?
:set binary
вперше ...
Я спробував відкрити величезний (~ 2 Гб) файл у VIM, але він захлинувся. Мені насправді не потрібно редагувати файл, просто досить ефективно стрибати.
Як я можу розпочати роботу з дуже великими файлами в VIM?
:set binary
вперше ...
Відповіді:
Я мав файл 12 Гб для редагування сьогодні. Плагін vim LargeFile не працював для мене. Він все-таки використав усю мою пам'ять, а потім надрукував повідомлення про помилку :-(. Я не міг використовувати hexedit для будь-якого, оскільки він не може нічого вставити, просто перезаписати. Ось альтернативний підхід:
Ви розділите файл, відредагуйте його частини, а потім повторно комбінуйте. Вам все одно потрібно двічі місця на диску.
Майте на увазі щось навколо рядка, який ви хочете відредагувати:
grep -n 'something' HUGEFILE | head -n 1
Витягніть цей діапазон файлу. Скажіть, що рядки, які ви хочете відредагувати, знаходяться у рядках 4 та 5. Потім виконайте такі дії:
sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
-n
параметр необхідний для придушення поведінки sed за замовчуванням, щоб надрукувати все4,5p
друкує рядки 4 і 55q
перериває sed після обробки 5 лінії Редагуйте SMALLPART
за допомогою улюбленого редактора.
Об'єднайте файл:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
тепер буде ваш відредагований файл, ви можете видалити оригінал HUGEFILE
.
Це питання, що повторюється, вже багато років. (Цифри постійно змінюються, але концепція однакова: як я переглядаю чи редагую файли, які перевищують пам'ять?)
Очевидно, more
чи less
це хороші підходи до простого читання файлів --- less
навіть vi
таких пропозицій, як клавіші для прокрутки та пошуку.
Freshmeat пошук на «великі файли» передбачає , що два редактора будуть особливо підходять для ваших потреб.
Одне було б: lfhex ... великий шестигранний редактор файлів (що залежить від Qt). Це, очевидно, тягне за собою використання GUI.
Інший, здавалося б, підходить для використання консолі: hed ... і він стверджує, що має vim
подібний інтерфейс (включаючи ex
режим?).
Я впевнений, що бачив інших редакторів для Linux / UNIX, які змогли переглядати файли, не завантажуючи їх у пам'ять. Однак я не пригадую жодного їх імені. Я роблю цю відповідь записом у вікі, щоб заохочувати інших додавати свої посилання до таких редакторів. (Так, я знайомий із способами вирішити проблему, використовуючи split
і cat
; але я думаю про редакторів, особливо редакторів консолей / прокльонів, які можуть обійтися цим і заощадити нам час / затримки та дисковий простір, що спричиняє такі підходи) .
Оскільки вам не потрібно фактично редагувати файл:
view
(щойно перевірений і приурочений). Зрозуміло, це не зовсім миттєво, але це працює.
Я написав невеликий сценарій на основі відповіді Флоріана, який використовує нано (мій улюблений редактор):
#!/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, ви можете їх редагувати, і коли ви збережете та вийдете, ці рядки у величезному файлі автоматично будуть перезаписані збереженими рядками.
У мене була така ж проблема, але це було MySQL дамп 300GB , і я хотів , щоб позбутися від 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
chmod +x mreplace.rb
спочатку, ви також можете простоruby mreplace.rb ..
Для величезних одноклассників (друкує символи від 1
до 99
):
cut -c 1-99 filename
Уже пізно, але якщо ви просто хочете переміщатися по файлу, не редагуючи його, теж cat
можете виконати роботу.
% cat filename | less
або ж просто:
% less filename
cat
перше відтворення файлу є шалено дурним, оскільки це означає, що файл буде повністю запам’ятовуватися (тому less
можна шукати файл), або його взагалі не можна шукати; cat
просто дає статичний вихідний потік.
Стара нитка. Але все-таки (каламбур :)).
$less filename
менш ефективно працює, якщо ви не хочете редагувати, а просто огляньте, що стосується вивчення величезних файлів журналів.
Шукайте в таких роботах, як vi
Найкраще, вона доступна за замовчуванням у більшості дистрибутивів. Тож не буде проблемою і виробниче середовище.
це старе, але використовуйте nano, vim або gvim