Ho provato ad aprire un file enorme (~ 2 GB) in VIM ma si è bloccato. In realtà non ho bisogno di modificare il file, basta saltare in modo efficiente.
Come posso lavorare con file molto grandi in VIM?
:set binary
prima ...
Ho provato ad aprire un file enorme (~ 2 GB) in VIM ma si è bloccato. In realtà non ho bisogno di modificare il file, basta saltare in modo efficiente.
Come posso lavorare con file molto grandi in VIM?
:set binary
prima ...
Risposte:
Oggi avevo un file da 12 GB da modificare. Il plugin vim LargeFile non ha funzionato per me. Ha ancora esaurito tutta la mia memoria e poi ha stampato un messaggio di errore :-(. Non ho potuto usare hexedit per nessuno dei due, poiché non può inserire nulla, basta sovrascriverlo. Ecco un approccio alternativo:
Suddividi il file, modifichi le parti e poi lo ricombini. Tuttavia, hai ancora bisogno del doppio dello spazio su disco.
Grep per qualcosa che circonda la riga che desideri modificare:
grep -n 'something' HUGEFILE | head -n 1
Estrai quell'intervallo del file. Supponi che le righe che desideri modificare siano alla riga 4 e 5. Quindi:
sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
-n
opzione è richiesta per sopprimere il comportamento predefinito di sed per stampare tutto4,5p
stampa le righe 4 e 55q
interrompe sed dopo l'elaborazione della riga 5 Modifica SMALLPART
utilizzando il tuo editor preferito.
Combina il file:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
sarà ora il tuo file modificato, puoi eliminare l'originale HUGEFILE
.
Questa è una domanda ricorrente da molti anni. (I numeri continuano a cambiare, ma il concetto è lo stesso: come faccio a visualizzare o modificare i file che sono più grandi della memoria?)
Ovviamente more
o less
sono buoni approcci alla semplice lettura dei file --- less
offre anche vi
combinazioni di tasti per lo scorrimento e la ricerca.
Una ricerca Freshmeat su "file di grandi dimensioni" suggerisce che due editor sarebbero particolarmente adatti alle tue esigenze.
Uno potrebbe essere: lfhex ... un editor esadecimale di file di grandi dimensioni (che dipende da Qt). Quello, ovviamente, comporta l'utilizzo di una GUI.
Un altro sembrerebbe adatto all'uso su console: hed ... e afferma di avere un'interfaccia vim
simile a quella (inclusa una ex
modalità?).
Sono sicuro di aver visto altri editor per Linux / UNIX che erano in grado di sfogliare i file senza caricare la loro interezza in memoria. Tuttavia, non ricordo nessuno dei loro nomi. Rendo questa risposta una voce "wiki" per incoraggiare altri ad aggiungere i loro collegamenti a tali editor. (Sì, ho familiarità con i modi per aggirare il problema utilizzando split
e cat
; ma sto pensando agli editor, in particolare agli editor di console / curses che possono farne a meno e farci risparmiare tempo / latenze e sovraccarico di spazio su disco che tali approcci comportano) .
Dal momento che non è necessario modificare effettivamente il file:
view
(appena provato e programmato). Certo, non è esattamente istantaneo, ma funziona.
Ho scritto un piccolo script basato sulla risposta di Florian che usa nano (il mio editor preferito):
#!/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
Usalo in questo modo:
sh hfnano yourHugeFile 3 8
In questo esempio, nano aprirà le righe da 3 a 8, puoi modificarle e quando salvi e esci, quelle righe nell'enorme file verranno automaticamente sovrascritte con le righe salvate.
Ho avuto lo stesso problema, ma era un dump mysql da 300 GB e volevo sbarazzarmi di DROP
e passare CREATE TABLE
a CREATE TABLE IF NOT EXISTS
quindi non volevo eseguire due invocazioni di sed
. Ho scritto questo rapido script Ruby per ingannare il file con queste modifiche:
#!/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
}
Invocato come
./mreplace.rb < foo.sql > foo_two.sql
chmod +x mreplace.rb
prima, potresti anche semplicementeruby mreplace.rb ..
Per battute molto grandi (stampa caratteri da 1
a 99
):
cut -c 1-99 filename
È già tardi, ma se vuoi semplicemente navigare nel file senza modificarlo, cat
puoi fare anche il lavoro.
% cat filename | less
o in alternativa semplice:
% less filename
cat
inserire prima il file è follemente stupido, poiché significa che il file sarebbe completamente in memoria (quindi è less
possibile cercare il file) o non può essere cercato affatto; cat
fornisce solo un flusso di output statico.
Vecchio filo. Ma comunque (gioco di parole :)).
$less filename
less funziona in modo efficiente se non si desidera modificare e basta guardarsi intorno quale è il caso per esaminare file di registro di grandi dimensioni.
Cerca in meno opere come vi
La parte migliore, è disponibile per impostazione predefinita sulla maggior parte delle distribuzioni. Quindi non sarà un problema anche per l'ambiente di produzione.
questo è vecchio ma, usa nano, vim o gvim