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 binaryzuerst ...
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 binaryzuerst ...
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
-nOption 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 SMALLPARTmit Ihrem Lieblingseditor.
Kombinieren Sie die Datei:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.newWird 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 moreoder lesssind gute Ansätze zum bloßen Lesen der Dateien - lesssogar Angebote viwie 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 exModus?).
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 splitund zu catumgehen. 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 DROPund zu wechseln CREATE TABLE, CREATE TABLE IF NOT EXISTSalso 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.rbzuerst auszuführen , könnten Sie auch nurruby mreplace.rb ..
Für große Einzeiler (druckt Zeichen von 1bis 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, catkönnen Sie den Job auch erledigen.
% cat filename | less
oder alternativ einfach:
% less filename
cates wahnsinnig dumm ist, die Datei zuerst zu tönen, da dies entweder bedeutet, dass sich die Datei vollständig im Speicher befindet (also lessdie Datei suchen kann) oder überhaupt nicht gesucht werden kann. catgibt 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