Ich habe darüber nachgedacht, ob diese Frage für SE geeignet ist oder nicht. Ich hoffe, Sie stimmen dem zu.
Vor einiger Zeit habe ich auf SE gefragt, wie man Text in Dateien findet und die Datei nur mit den passenden Zeilen belässt, die den gesuchten Text enthalten. Die Frage ist hier: Wie finde ich Text in Dateien und behalte nur die entsprechenden übereinstimmenden Zeilen über das Terminal unter OS X bei?
Während die Antwort perfekt funktionierte, frage ich mich jetzt, warum sed
es so schnell geht. In meinem Anwendungsfall hatte ich ziemlich viele Dateien, die insgesamt etwa 30 GB groß waren. Der sed
Befehl lief in ungefähr 12 Sekunden, was ich nie geglaubt hätte (Arbeiten mit einer normalen Festplatte). Innerhalb von 12 Sekunden las der Befehl 30 GB Text durch und schnitt jede Datei ab, um nur die entsprechenden Zeilen beizubehalten, nach denen ich gefiltert habe. Wie funktioniert das? (oder: was ist das für eine Zauberei?)
Der eigentliche Befehl war:
find . -type f -exec sed -i'' '/\B\/foobar\b/!d' {} \;
quelle
find . -type f -exec sed -i'' '/\B\/foobar\b/!d' {} \;
grep
so schnell? und (vielleicht) Funktioniert esgrep
schneller mit langen oder kurzen Suchbegriffen?Antworten:
Die wahrscheinliche Antwort lautet:
sed
ist ein Stream-Editor; Es wird jeweils nur eine Zeile verarbeitet. Dies bedeutet, dass der Speicherbedarf winzig ist. Im Gegensatz zu einem Texteditor wieemacs
odervim
muss nicht die gesamte Kopie der Datei im Speicher gespeichert werden.-i
direkt (mit ), wodurch (wie von @Ramesh gezeigt und auch auf der Wikipedia-Seite angegeben ) temporäre Dateien erstellt werden, die dann zur alten Datei werden.All dies bedeutet, dass
sed
fast das Minimum an Dateivorgängen ausgeführt werden kann: Jede Zeile der Originaldatei wird einmal gelesen und nur die übereinstimmenden Zeilen werden geschrieben.Ihre Wahl der regulären Ausdrücke wirkt sich auch auf die Leistung aus, manchmal auf sehr schlechte Weise: Codierung des Horror-Blogs .
quelle
Ein wunderbares Beispiel ist die
sed
Verwendung einer temporären Datei, um den Inhalt tatsächlich zu speichern und dann die Originaldatei zu ersetzen. Sie können beispielsweise einen einfachen Test durchführen, um dies zu ermitteln.Führen Sie nun aus
ls -li
, um die Inode-Nummer zu überprüfen.Geben Sie nun den folgenden
sed
Befehl ein, um eine Leerzeile hinzuzufügen.Geben Sie nach dem Ändern der Datei den
ls
Befehl erneut aus und überprüfen Sie die Inode-Nummer.Wir können sehen, dass sich die Inode-Nummer tatsächlich geändert hat. Anstatt in dieselbe Datei zu kopieren,
sed
wird eine neue temporäre Datei erstellt und der Inhalt in die neue temporäre Datei kopiert. Anschließend wird die Originaldatei gelöscht und die tmp-Datei synchron mit der Originaldatei umbenannt. Dies ist einer der Gründe, warum die Dateivorgänge wirklich schneller sind .Zitat aus der Wikipedia-Seite ,
Um mehr über den Musterraum und die Speicherraumkonzepte von zu erfahren
sed
, sollten Sie die Antwort hier lesen .quelle