Cat, Grep, Redirect Output… Leere Datei?


8

Ich bin gerade gelaufen

cat /opt/webapplications/Word/readme.log | grep -v 'Apple'

und ich bekam die Ausgabe auf dem Cli, die ich erwartet hatte, das waren alle Zeilen readme.log, die nicht ' Apple' enthielten ...

Als nächstes rannte ich ...

cat /opt/webapplications/Word/readme.log | grep -v 'Apple' > /opt/webapplications/Word/readme.log

Ist /opt/webapplications/Word/readme.logjedoch leer.

Kann mir jemand erklären, warum dies passiert ist oder wie ich das hätte tun sollen?



1
Sie versuchen, Sie lesen und schreiben die gleiche Datei und Bash-Prozesse Umleitung zuerst (von rechts nach links)
aaaaa sagt wieder Monica

Antworten:


14

Dies geschah, weil als erstes >die Datei erstellt werden muss, in die geschrieben werden soll. Wenn die Datei bereits vorhanden ist, wird ihr Inhalt gelöscht. (Außerdem müssen Sie catIhre Anweisung überhaupt nicht verwenden, da sie grepnicht nur mit STDIN, sondern auch mit Dateien funktioniert.)

Der richtige Weg, dies zu tun, besteht darin, eine temporäre Datei zum Lesen oder Schreiben zu verwenden. Also entweder

cp /opt/webapplications/Word/readme.log /tmp/readme.log
grep -v 'Apple' /tmp/readme.log > /opt/webapplications/Word/readme.log

oder

grep -v 'Apple' /opt/webapplications/Word/readme.log > /tmp/readme.log
mv /tmp/readme.log /opt/webapplications/Word/readme.log

würde funktionieren.


1

Wenn Sie in dieselbe Datei umleiten ( >), kann die Shell die Datei erstellen / abschneiden, bevor der catBefehl aufgerufen und die Eingabe gelesen wird (siehe: Warum funktioniert „Datei1 sortieren> Datei1“ nicht? ). Wenn Sie die Datei filtern möchten, ist es besser, die Ausgabe in eine andere Datei umzuleiten oder eine Umleitung zu vermeiden, zum Beispiel:

grep -v 'Apple' readme.log | tee readme.log

Der bessere und sicherere Weg ist die Verwendung von In-Place-Editoren, die für diese Art von Vorgängen ausgelegt sind, z

sed -i '.bak' '/Apple/d' readme.log

oder verwenden ex(Teil von Vim):

ex +g/Apple/d -cwq readme.log

Verbunden:

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.