Я попытался открыть огромный (~ 2 ГБ) файл в VIM, но он задохнулся. Мне действительно не нужно редактировать файл, просто прыгайте эффективно.
Как я могу работать с очень большими файлами в VIM?
Я попытался открыть огромный (~ 2 ГБ) файл в VIM, но он задохнулся. Мне действительно не нужно редактировать файл, просто прыгайте эффективно.
Как я могу работать с очень большими файлами в VIM?
У меня был 12-гигабайтный файл для редактирования сегодня. Плагин vim LargeFile не работал у меня. Он все еще использовал всю мою память, а затем печатал сообщение об ошибке:-(. Я не мог использовать hexedit для того, чтобы он ничего не мог вставить, просто перезапишите. Вот альтернативный подход:
Вы разбиваете файл, редактируете детали и затем рекомбинируете его. Вам все равно нужно вдвое больше места на диске.
Grep для чего-то, окружающего линию, которую вы хотите отредактировать:
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 после строки обработкиИзмените SMALLPART
с помощью любимого редактора.
Объедините файл:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
теперь будет вашим отредактированным файлом, вы можете удалить оригинал HUGEFILE
.
Это повторяющийся вопрос в течение многих лет. (Числа продолжают меняться, но концепция одна и та же: как мне просматривать или редактировать файлы, большие, чем память?)
Очевидно, что more
или less
- хорошие подходы к простому чтению файлов --- less
даже предлагает vi
, как привязки клавиш для прокрутки и поиска.
A Freshmeat поиск в "больших файлах" предполагает, что два редактора будут особенно подходящими для ваших нужд.
Можно было бы: lfhex... большой редактор шестнадцатеричных файлов (который зависит от Qt). Очевидно, что это связано с использованием графического интерфейса.
Другой, похоже, подходит для использования в консолях: hed... и утверждает, что имеет интерфейс vim
-like (включая режим ex
?).
Я уверен, что видел других редакторов Linux/UNIX, которые могли просматривать страницы без загрузки их в памяти. Однако я не помню ни одного из их имен. Я делаю этот ответ "вики", чтобы побуждать других добавлять ссылки на таких редакторов. (Да, мне знакомы способы решения проблемы с помощью split
и cat
, но я думаю об редакторах, особенно к редакторам консоли /curses, которые могут обойтись без этого и сохранить время/задержки и пространство на диске накладные расходы, связанные с такими подходами).
Поскольку вам не нужно фактически редактировать файл:
Я написал немного script на основе ответа Флориана, который использует 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, вы можете их редактировать, а когда вы сохраните и выйдете, эти строки в огромном файле будут автоматически перезаписаны сохраненными строками.
Это уже поздно, но если вы просто хотите перемещаться по файлу без его редактирования, cat
тоже может выполнять задание.
% cat filename | less
или альтернативно просто:
% less filename
У меня была та же проблема, но это был дамп mysql в 300 Гбайт, и я хотел избавиться от DROP
и изменить CREATE TABLE
на CREATE TABLE IF NOT EXISTS
, поэтому не хотел запускать два вызова sed
. Я написал этот быстрый Ruby script, чтобы обмануть файл с этими изменениями:
#!/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
emacs отлично работает с файлами в 100 мегабайт, я использовал его в файлах журналов без особых проблем.
Но обычно, когда у меня есть какая-то задача анализа, я нахожу, что лучше написать perl script.
Для огромных однострочных (печатает символы от 1
до 99
):
cut -c 1-99 filename
Старый поток. Но тем не менее (каламбур:)).
$less filename
меньше работает эффективно, если вы не хотите редактировать и просто смотрите вокруг, что происходит при рассмотрении огромных файлов журнала.
Искать в менее работает, например, vi
Лучшая часть, она доступна по умолчанию для большинства дистрибутивов. Так что это тоже не проблема для производственной среды.
Это старый, но, использовать nano, vim или gvim