Ich habe versucht sed
, einige Schlüsselwörter in einer großen Datei (100 MB) zu ersetzen. Die -i
(Inplace-) Option war mir nicht bekannt, daher war mein erster Versuch, die Weiterleitung folgendermaßen durchzuführen:
sed 's/original/edited/g' file.log >> file.log
Was danach passierte war, dass mein PC zum Stillstand kam, fast ohne Tastatureingabe. Ich habe versucht , eine andere Konsole Ctrl+ Alt+ F1aber nach Benutzername langsam eintritt, ist es auch angehalten. Ohne Tastatur bestand meine einzige Option darin, die Maschine per Hardware-Reset zurückzusetzen. Nach dem Einloggen sah ich, dass file.log ungefähr 8 GB groß war.
Ich möchte wirklich verstehen, warum die Ausführung dieses Befehls dazu geführt hat, dass das System nicht mehr reagiert, und ob auf Systemebene Mechanismen vorhanden sind, die Warnungen auslösen und den fehlerhaften Prozess beenden.
quelle
free -h
?ex -sc '%s/original/edited/ge|x' file.log
sollte tun, was Sie in einer UNIX-idiomatischen Weise ohne diesed -i
Nebenwirkungen wollen.Antworten:
>>
Hängt, wie bereits gesagt, an die Datei an, sodass Ihrsed
Befehl die gerade ausgegebenen Zeilen liest und sie dann weiter ausgibt. Wenn Sie wollten Ihre Datei an Ort und Stelle ersetzen,>
würde immer noch nicht arbeiten, aber Sie sind sich bewusst vonsed
‚s --i
Option, die auf jeden Fall derjenige ist , Sie wollen.Wenn Sie jedoch absolut sicher sind, dass Sie an eine Datei, die Sie als Stream lesen, einen Anhang anhängen möchten, und dies nur einmal tun möchten, ziehen Sie die Verwendung
sponge
aus demmoreutils
Paket in Betracht .sponge
Liest von stdin in den Speicher, bis EOF, und speichert dann den gesamten Inhalt in stdout. Dadurchsed
wird das Ende der Datei erreicht, das Lesen beendet, die Datei geschlossen und der Schwamm beginnt, daran anzuhängen.quelle
sponge
ist ein hilfreiches Werkzeug zu wissen, abersed
hat bereits eine-i
Option:-i[SUFFIX], --in-place[=SUFFIX], edit files in place (makes backup if SUFFIX supplied)
.>>
, was anhängt und nicht>
ersetzt. Zugegeben, OP wurde-i
in der Veröffentlichung ausdrücklich erwähnt, und es scheint ein weitaus häufigerer Anwendungsfall als dieser zu sein, aber ich dachte, es wäre erwähnenswert, dass die spezifische Operation, die OP veröffentlicht hatte, ohne allzu großen Aufwand möglich war, wenn Sie wirklich sind Natürlich ist es das, was Sie tun möchten.sponge
, werfen Sie einen Blick aufvipe
.moreutils
ist nur ein magisches Paket mit Dingen, von denen du nieIhr
sed
Befehl hat versucht, die Datei zu lesen, an die er angehängt wurde. Es wird niemals das Dateiende erreichen, aber viel CPU-Zeit in Anspruch nehmen. Deshalb wurde ^ C (Interrupt Current Process) erfunden.quelle
Ein Zurückhängen an die Datei, aus der Sie gelesen haben, ist in keinem Fall eine gute Idee, da Sie am Ende eine ständig wachsende Datei haben werden. Wenn Sie wirklich in die Datei zurückschreiben möchten, sollten Sie das
-i
Flag verwenden:oder wenn Sie möchten, dass ein Backup erstellt wird, bevor Sie Änderungen vornehmen, können Sie dem
-i
Flag ein Dateisuffix hinzufügen :Dies würde eine Datei mit dem Namen erzeugen
file.log.bak
und dann die Änderungen vornehmen, die Sie dort vorgenommen haben, indem Sie versucht haben, an die Datei, aus der Sie lesen, einen Slang für Daten anzuhängen, in dem verschiedene Prozesse für dieselbe Datenquelle - Eingabe oder Ausgabe - in Frage kommen . Dies ist auch der Grund, warum Ihre Maschine zum Stillstand gekommen ist.quelle
"I really would like to understand why the execution of that command was able to make the system so unresponsive, and if mechanisms exist at the system level to trigger alerts and kill the offending process?"
strace
Teil des gesamten Prozesses auf der anderen Seite reproduzierte das Ergebnis nicht und dies auf meinem Computer und auf dem Computer eines anderen Benutzers. Sicher, es gibt Mechanismen, mit denen Sie nicht mehr reagierende Anwendungen beenden können. Wenn Ihr Computer jedoch nicht mehr reagiert, haben Sie nur noch eine Option, mit der Sie ihn zurücksetzen können. Ich teste dies immer noch und bevor ich nicht vollständig verstehe, was das beschriebene Verhalten verursacht, kann ich diesen Teil der Frage nicht beantworten.sed
das ganze Ding in den Speicher gepuffert und dann geschlossen wird, anstatt den Griff festzuhalten. Bei einer ~ 100-MB-Datei wuchs sie wie in OP auf unbestimmte Zeit, ohne die Maschine zu blockieren.