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?
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
-n
L'option est requise pour supprimer le comportement par défaut de sed et tout imprimer.4,5p
imprime les lignes 4 et 55q
_ 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
HUGEFILE.new
sera désormais votre fichier édité, vous pouvez supprimer l'original HUGEFILE
.
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).
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.
Pour les énormes lignes simples (imprime les caractères de 1
à 99
):
cut -c 1-99 filename
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
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
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.
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.