Ich habe versucht, eine riesige Datei (~ 2 GB) in VIM zu öffnen, aber sie ist verstopft. Ich muss die Datei nicht bearbeiten, sondern nur effizient herumspringen.
Wie kann ich mit sehr großen Dateien in VIM arbeiten?
:set binary
zuerst ...
Ich habe versucht, eine riesige Datei (~ 2 GB) in VIM zu öffnen, aber sie ist verstopft. Ich muss die Datei nicht bearbeiten, sondern nur effizient herumspringen.
Wie kann ich mit sehr großen Dateien in VIM arbeiten?
:set binary
zuerst ...
Antworten:
Ich hatte heute eine 12-GB-Datei zum Bearbeiten. Das vim LargeFile-Plugin hat bei mir nicht funktioniert. Es hat immer noch meinen gesamten Speicher verbraucht und dann eine Fehlermeldung ausgegeben :-(. Ich konnte Hexedit auch nicht verwenden, da es nichts einfügen kann, sondern nur überschreiben. Hier ist ein alternativer Ansatz:
Sie teilen die Datei, bearbeiten die Teile und kombinieren sie neu. Sie benötigen jedoch immer noch doppelt so viel Speicherplatz.
Suchen Sie nach etwas, das die Linie umgibt, die Sie bearbeiten möchten:
grep -n 'something' HUGEFILE | head -n 1
Extrahieren Sie diesen Bereich der Datei. Angenommen, die Zeilen, die Sie bearbeiten möchten, befinden sich in Zeile 4 und 5. Führen Sie dann folgende Schritte aus:
sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
-n
Option ist erforderlich, um das Standardverhalten von sed zu unterdrücken und alles zu drucken4,5p
druckt die Zeilen 4 und 55q
bricht nach der Verarbeitung von Zeile 5 ab Bearbeiten Sie SMALLPART
mit Ihrem Lieblingseditor.
Kombinieren Sie die Datei:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
Wird nun Ihre bearbeitete Datei, können Sie das Original löschen HUGEFILE
.
Dies ist seit vielen Jahren eine wiederkehrende Frage. (Die Zahlen ändern sich ständig, aber das Konzept ist das gleiche: Wie kann ich Dateien anzeigen oder bearbeiten, die größer als der Speicher sind?)
Offensichtlich more
oder less
sind gute Ansätze zum bloßen Lesen der Dateien - less
sogar Angebote vi
wie Tastenkombinationen zum Scrollen und Suchen.
Eine Freshmeat- Suche nach "großen Dateien" legt nahe, dass zwei Editoren besonders für Ihre Anforderungen geeignet sind.
Eine wäre: lfhex ... ein Hex-Editor für große Dateien (der von Qt abhängt). Dies beinhaltet natürlich die Verwendung einer GUI.
Eine andere scheint für die Konsolennutzung geeignet zu sein: hed ... und behauptet, eine vim
ähnliche Oberfläche zu haben (einschließlich eines ex
Modus?).
Ich bin sicher, ich habe andere Editoren für Linux / UNIX gesehen, die Dateien durchblättern konnten, ohne ihre Gesamtheit in den Speicher zu laden. Ich erinnere mich jedoch an keinen ihrer Namen. Ich mache diese Antwort zu einem "Wiki" -Eintrag, um andere zu ermutigen, ihre Links zu solchen Editoren hinzuzufügen. (Ja, ich bin mit Möglichkeiten vertraut, um das Problem mit split
und zu cat
umgehen. Ich denke jedoch an Editoren, insbesondere an Konsolen- / Fluch-Editoren, die darauf verzichten und uns die Zeit / Latenzen und den Speicherplatz sparen können, die solche Ansätze mit sich bringen.) .
Da Sie die Datei nicht wirklich bearbeiten müssen:
view
(nur ausprobiert und zeitgesteuert). Zugegeben, das ist nicht gerade augenblicklich, aber es funktioniert.
Ich habe ein kleines Skript geschrieben, das auf Florians Antwort basiert und Nano (meinen Lieblingseditor) verwendet:
#!/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
Verwenden Sie es so:
sh hfnano yourHugeFile 3 8
In diesem Beispiel öffnet nano die Zeilen 3 bis 8, Sie können sie bearbeiten, und wenn Sie speichern und beenden, werden diese Zeilen in der riesigen Datei automatisch mit Ihren gespeicherten Zeilen überschrieben.
Ich hatte das gleiche Problem, aber es war ein 300 GB MySQL-Dump und ich wollte das loswerden DROP
und zu wechseln CREATE TABLE
, CREATE TABLE IF NOT EXISTS
also wollte ich nicht zwei Aufrufe von ausführen sed
. Ich habe dieses schnelle Ruby-Skript geschrieben, um die Datei mit den folgenden Änderungen zu betrügen:
#!/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
}
Aufgerufen wie
./mreplace.rb < foo.sql > foo_two.sql
chmod +x mreplace.rb
zuerst auszuführen , könnten Sie auch nurruby mreplace.rb ..
Für große Einzeiler (druckt Zeichen von 1
bis 99
):
cut -c 1-99 filename
Es ist bereits spät, aber wenn Sie nur durch die Datei navigieren möchten, ohne sie zu bearbeiten, cat
können Sie den Job auch erledigen.
% cat filename | less
oder alternativ einfach:
% less filename
cat
es wahnsinnig dumm ist, die Datei zuerst zu tönen, da dies entweder bedeutet, dass sich die Datei vollständig im Speicher befindet (also less
die Datei suchen kann) oder überhaupt nicht gesucht werden kann. cat
gibt nur statischen Ausgabestream.
Alter Faden. Aber trotzdem (Wortspiel :)).
$less filename
Weniger funktioniert effizient, wenn Sie nicht bearbeiten und sich nur umschauen möchten, was bei der Prüfung großer Protokolldateien der Fall ist.
Suche in weniger Werken wie vi
Das Beste daran ist, dass es in den meisten Distributionen standardmäßig verfügbar ist. Dies ist also auch für die Produktionsumgebung kein Problem.
Das ist alt, aber benutze Nano, Vim oder Gvim