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

8

Saya hanya berlari

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

dan saya mendapatkan output pada cli yang saya harapkan, yang merupakan semua baris readme.logyang tidak mengandung ' Apple' ...

Selanjutnya saya berlari ...

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

Namun, /opt/webapplications/Word/readme.logkosong.

Adakah yang bisa menjelaskan kepada saya mengapa ini terjadi, atau cara yang benar yang seharusnya saya lakukan tentang ini?

Jeffrey L. Roberts
sumber
stackoverflow.com/questions/6696842/…
aaaaa mengatakan mengembalikan Monica
1
Anda mencoba membaca dan menulis file yang sama dan proses bash redirection terlebih dahulu (kanan-ke-kiri)
aaaaa mengatakan mengembalikan Monica

Jawaban:

14

Ini terjadi karena hal pertama yang >dilakukan adalah membuat file yang ingin ditulisnya - dan jika file sudah ada, isinya akan dihapus. (Juga, tidak perlu sama sekali untuk digunakan catdalam pernyataan Anda karena grepbekerja pada file, tidak hanya pada STDIN.)

Cara yang benar untuk melakukan ini adalah dengan menggunakan file sementara baik untuk membaca atau menulis. Begitu juga

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

atau

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

akan bekerja.

Jenny D
sumber
1

Ketika melakukan pengalihan ke file yang sama ( >), shell dapat membuat / memotong file sebelum catperintah dipanggil dan input dibaca (lihat: Mengapa "sort file1> file1" tidak berfungsi? ). Jika Anda ingin memfilter file, lebih baik untuk mengarahkan output ke file yang berbeda, atau menghindari pengalihan sama sekali, misalnya:

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

Cara yang lebih baik dan lebih aman adalah dengan menggunakan editor di tempat yang dirancang untuk operasi semacam itu, misalnya

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

atau gunakan ex(bagian dari Vim):

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

Terkait:

kenorb
sumber