Cat, Grep, Redirect Output ... File vuoto?


8

Ho appena corso

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

e ho ottenuto l'output sul cli che mi aspettavo, che era tutte le righe readme.logche non contenevano ' Apple' ...

Poi ho corso ...

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

Tuttavia, /opt/webapplications/Word/readme.logè vuoto.

Qualcuno può spiegarmi perché è successo o nel modo corretto in cui avrei dovuto farlo?



1
stai provando a leggere e scrivere lo stesso file e bash prima reindirizza i processi (da destra a sinistra)
aaaaa dice di ripristinare Monica il

Risposte:


14

Ciò è accaduto perché la prima cosa da >fare è creare il file in cui desidera scrivere - e se il file esiste già, il suo contenuto verrà eliminato. (Inoltre, non è necessario utilizzare catla dichiarazione poiché grepfunziona sui file, non solo su STDIN.)

Il modo corretto per farlo è utilizzare un file temporaneo per leggere o scrivere. Quindi neanche

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

o

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

funzionerebbe.


1

Quando si esegue il reindirizzamento nello stesso file ( >), la shell può creare / troncare il file prima che il catcomando sia invocato e l'input venga letto (vedere: Perché "sort file1> file1" non funziona? ). Se si desidera filtrare il file, è meglio reindirizzare l'output in un file diverso o evitare il reindirizzamento, ad esempio:

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

Il modo migliore e più sicuro è utilizzare editor sul posto progettati per quel tipo di operazioni, ad es

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

o utilizzare ex(parte di Vim):

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

Relazionato:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.