web-dev-qa-db-fra.com

Travailler avec d’énormes fichiers dans VIM

J'ai essayé d'ouvrir un énorme fichier (~ 2 Go) dans VIM mais cela s'est étouffé. Je n'ai pas réellement besoin d'éditer le fichier, il suffit de naviguer efficacement.

Comment puis-je travailler avec de très gros fichiers dans VIM?

106
hoju

J'avais un fichier de 12 Go à éditer aujourd'hui. Le plugin vim LargeFile ne fonctionnait pas pour moi. Il utilisait toujours toute ma mémoire, puis imprimait un message d'erreur :-(. Je ne pouvais pas utiliser hexedit, car il ne peut rien insérer, juste écraser. Voici une approche alternative:

Vous divisez le fichier, éditez les pièces, puis vous le recombinez. Cependant, vous avez toujours besoin de deux fois plus d'espace disque.

  • Grep pour quelque chose autour de la ligne que vous souhaitez éditer:

    grep -n 'something' HUGEFILE | head -n 1
    
  • Extrayez cette plage du fichier. Dites que les lignes que vous souhaitez modifier se trouvent aux lignes 4 et 5. Ensuite, faites:

    sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
    
    • Le -n L'option est requise pour supprimer le comportement par défaut de sed et tout imprimer.
    • 4,5p imprime les lignes 4 et 5
    • 5q _ avorte après la ligne de traitement 5
  • Éditez SMALLPART en utilisant votre éditeur favori.

  • Combinez le fichier:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • c.-à-d.: choisissez toutes les lignes avant les lignes modifiées dans HUGEFILE (qui sont ici les 3 premières lignes), combinez-les avec les lignes modifiées (ici lignes 4 et 5) et utilisez cet ensemble combiné de lignes pour remplacer équivalent (dans ce cas, les 5 premières lignes) dans HUGEFILE et écrivez le tout dans un nouveau fichier.

    HUGEFILE.new sera désormais votre fichier édité, vous pouvez supprimer l'original HUGEFILE.

84
Florian

Cette question est récurrente depuis de nombreuses années. (Les nombres changent constamment, mais le concept est le même: comment visualiser ou éditer des fichiers plus volumineux que la mémoire?)

Il est évident que more ou less sont de bonnes approches pour simplement lire les fichiers --- less offre même vi comme des raccourcis clavier pour le défilement et la recherche.

Une recherche Freshmeat sur des "fichiers volumineux" suggère que deux éditeurs seraient particulièrement adaptés à vos besoins.

On pourrait être: lfhex ... un éditeur de fichier de grande taille (qui dépend de Qt). Celui-ci, évidemment, implique l'utilisation d'une interface graphique.

Une autre solution semble convenir à l’utilisation de la console: hed ... et prétend posséder une interface de type vim- (y compris un mode ex??).

Je suis sûr que j'ai vu d'autres éditeurs pour Linux/UNIX capables de parcourir des fichiers sans les charger entièrement dans la mémoire. Cependant, je ne me souviens d'aucun de leurs noms. Je fais de cette réponse une entrée "wiki" pour encourager les autres à ajouter leurs liens vers de tels éditeurs. (Oui, je sais comment contourner le problème en utilisant split et cat; mais je pense aux éditeurs, en particulier aux éditeurs console/curses qui peuvent se passer de cela et nous épargner la temps/latences et surcharge d’espace disque que de telles approches impliquent).

30
Jim Dennis

Puisque vous n'avez pas besoin de modifier le fichier:

  1. view (ou vim -R) devrait fonctionner relativement bien sur les gros fichiers.
  2. Ou vous pouvez utiliser more ou less
21
ChssPly76

J'ai écrit un petit script basé sur la réponse de Florian qui utilise nano (mon éditeur préféré):

#!/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

Utilisez-le comme ceci:

sh hfnano yourHugeFile 3 8

Dans cet exemple, nano ouvrira les lignes 3 à 8, vous pourrez les éditer. Lorsque vous enregistrez et quittez l'application, ces lignes du fichier gigantesque seront automatiquement écrasées par vos lignes enregistrées.

8
B T

Pour les énormes lignes simples (imprime les caractères de 1 à 99):

cut -c 1-99 filename
3
DmitrySandalov

J'ai eu le même problème, mais c'était un dump mysql de 300 Go et je voulais me débarrasser du DROP et changer CREATE TABLE à CREATE TABLE IF NOT EXISTS donc je ne voulais pas lancer deux invocations de sed. J'ai écrit ce script rapide Ruby) pour dupliquer le fichier avec ces modifications:

#!/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
}

Invoqué comme

./mreplace.rb < foo.sql > foo_two.sql
3
Steeve McCauley

Il est déjà tard mais si vous voulez simplement parcourir le fichier sans le modifier, cat peut également faire le travail.

% cat filename | less

ou alternativement simple:

% less filename
2
chepukha

emacs fonctionne très bien avec des fichiers dans les centaines de mégaoctets, je l’ai utilisé dans les fichiers journaux sans trop de problèmes.

Mais généralement, lorsque j'ai une tâche d'analyse, je trouve que l'écriture d'un script Perl est un meilleur choix.

1
Andy Ross

Vieux fil. Mais néanmoins (jeu de mots :)).

 $less filename

moins fonctionne efficacement si vous ne voulez pas éditer et regardez autour de vous, ce qui est le cas pour examiner de gros fichiers journaux.

Rechercher dans moins fonctionne comme vi

La meilleure partie, il est disponible par défaut sur la plupart des distributions. Ce ne sera donc pas un problème pour l’environnement de production.

0
deepdive