Работа с огромными файлами в VIM

Я попытался открыть огромный (~ 2 ГБ) файл в VIM, но он задохнулся. Мне действительно не нужно редактировать файл, просто прыгайте эффективно.

Как я могу работать с очень большими файлами в VIM?

Ответ 1

У меня был 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 и 5
    • 5q прерывает sed после строки обработки
  • Измените SMALLPART с помощью любимого редактора.

  • Объедините файл:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • т.е.: выберите все строки перед отредактированными строками из HUGEFILE (в этом случае это верхние 3 строки), объедините их с отредактированными строками (в этом случае строки 4 и 5) и используйте этот комбинированный набор строк заменить эквивалент (в этом случае верхние 5 строк) в HUGEFILE и записать все это в новый файл.

    HUGEFILE.new теперь будет вашим отредактированным файлом, вы можете удалить оригинал HUGEFILE.

Ответ 2

Это повторяющийся вопрос в течение многих лет. (Числа продолжают меняться, но концепция одна и та же: как мне просматривать или редактировать файлы, большие, чем память?)

Очевидно, что more или less - хорошие подходы к простому чтению файлов --- less даже предлагает vi, как привязки клавиш для прокрутки и поиска.

A Freshmeat поиск в "больших файлах" предполагает, что два редактора будут особенно подходящими для ваших нужд.

Можно было бы: lfhex... большой редактор шестнадцатеричных файлов (который зависит от Qt). Очевидно, что это связано с использованием графического интерфейса.

Другой, похоже, подходит для использования в консолях: hed... и утверждает, что имеет интерфейс vim -like (включая режим ex?).

Я уверен, что видел других редакторов Linux/UNIX, которые могли просматривать страницы без загрузки их в памяти. Однако я не помню ни одного из их имен. Я делаю этот ответ "вики", чтобы побуждать других добавлять ссылки на таких редакторов. (Да, мне знакомы способы решения проблемы с помощью split и cat, но я думаю об редакторах, особенно к редакторам консоли /curses, которые могут обойтись без этого и сохранить время/задержки и пространство на диске накладные расходы, связанные с такими подходами).

Ответ 3

Поскольку вам не нужно фактически редактировать файл:

  • view (или vim -R) должен хорошо работать в больших файлах.
  • Или вы можете использовать more или less

Ответ 4

Я написал немного 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, вы можете их редактировать, а когда вы сохраните и выйдете, эти строки в огромном файле будут автоматически перезаписаны сохраненными строками.

Ответ 5

Это уже поздно, но если вы просто хотите перемещаться по файлу без его редактирования, cat тоже может выполнять задание.

% cat filename | less

или альтернативно просто:

% less filename

Ответ 6

У меня была та же проблема, но это был дамп 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

Ответ 7

emacs отлично работает с файлами в 100 мегабайт, я использовал его в файлах журналов без особых проблем.

Но обычно, когда у меня есть какая-то задача анализа, я нахожу, что лучше написать perl script.

Ответ 8

Для огромных однострочных (печатает символы от 1 до 99):

cut -c 1-99 filename

Ответ 9

Старый поток. Но тем не менее (каламбур:)).

 $less filename

меньше работает эффективно, если вы не хотите редактировать и просто смотрите вокруг, что происходит при рассмотрении огромных файлов журнала.

Искать в менее работает, например, vi

Лучшая часть, она доступна по умолчанию для большинства дистрибутивов. Так что это тоже не проблема для производственной среды.

Ответ 10

Это старый, но, использовать nano, vim или gvim