Я попытался открыть в VIM огромный (~ 2 ГБ) файл, но он задохнулся. На самом деле мне не нужно редактировать файл, просто эффективно прыгайте.
Как я могу работать с очень большими файлами в VIM?
:set binary
сначала ...
Я попытался открыть в VIM огромный (~ 2 ГБ) файл, но он задохнулся. На самом деле мне не нужно редактировать файл, просто эффективно прыгайте.
Как я могу работать с очень большими файлами в 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). Это, очевидно, предполагает использование графического интерфейса.
Другой, казалось бы, подходит для использования в консоли: hed ... и он утверждает, что имеет vim
-подобный интерфейс (включая ex
режим?).
Я уверен, что видел другие редакторы для Linux / UNIX, которые могли листать файлы, не загружая их в память целиком. Однако я не помню их имен. Я делаю этот ответ «вики», чтобы побудить других добавлять свои ссылки на таких редакторов. (Да, я знаком со способами решения проблемы с помощью split
и cat
; но я думаю о редакторах, особенно о редакторах console / curses, которые могут обойтись без этого и сэкономить нам время / задержки и накладные расходы на дисковое пространство, которые влекут за собой такие подходы) .
Поскольку вам не нужно фактически редактировать файл:
view
(только что попробовал и рассчитал). Конечно, это не совсем мгновенно, но работает.
Я написал небольшой сценарий на основе ответа Флориана, в котором используется 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, вы можете их отредактировать, а когда вы сохраните и закроете, эти строки в огромном файле будут автоматически перезаписаны вашими сохраненными строками.
У меня была та же проблема, но это был дамп mysql объемом 300 ГБ, и я хотел избавиться от него 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
сначала exe , вы также можете простоruby mreplace.rb ..
Для больших однострочных строк (печатает символы от 1
до 99
):
cut -c 1-99 filename
Уже поздно, но если вы просто хотите перемещаться по файлу, не редактируя его, cat
вы тоже можете это сделать.
% cat filename | less
или, альтернативно, просто:
% less filename
cat
сначала указывать файл безумно глупо, так как это либо означает, что файл полностью находится в памяти (так что less
можно искать файл), либо его нельзя искать вообще; cat
просто дает статический выходной поток.
Старая нить. Но тем не менее (каламбур :)).
$less filename
less работает эффективно, если вы не хотите редактировать, а просто осмотритесь, что имеет место при проверке огромных файлов журнала.
Искать в less работает как vi
Самое приятное, что он доступен по умолчанию в большинстве дистрибутивов. Так что не будет проблем и для производственной среды.
это старый, но используйте nano, vim или gvim