Saya mencoba sed
mengganti beberapa kata kunci dalam file besar (100 MB). Saya tidak mengetahui opsi -i
(inplace), jadi upaya pertama saya adalah mengarahkan seperti ini:
sed 's/original/edited/g' file.log >> file.log
apa yang terjadi setelah itu adalah PC saya berhenti, hampir tidak ada input keyboard. Saya mencoba konsol yang berbeda Ctrl+ Alt+ F1tetapi setelah perlahan memasukkan nama pengguna, itu terhenti juga. Tanpa keyboard, satu-satunya pilihan saya adalah mengatur ulang perangkat dengan perangkat keras. Setelah masuk, saya melihat file.log itu sekitar 8 GB.
Saya benar-benar ingin memahami mengapa pelaksanaan perintah itu dapat membuat sistem jadi tidak responsif, dan jika ada mekanisme di tingkat sistem untuk memicu peringatan dan membunuh proses yang menyinggung?
command-line
sed
cesarpachon
sumber
sumber
free -h
?ex -sc '%s/original/edited/ge|x' file.log
harus melakukan apa yang Anda inginkan dengan cara UNIX idiomatik tanpased -i
efek samping.Jawaban:
Seperti yang telah dikatakan,
>>
ditambahkan ke file, jadised
perintah Anda akan duduk di sana membaca baris yang baru saja dikeluarkan, dan kemudian mengeluarkannya lagi. Jika Anda ingin mengganti file Anda di tempat,>
masih tidak akan bekerja, tapi Anda sedang menyadarised
's-i
pilihan, yang pasti yang Anda inginkan.Namun, jika Anda benar-benar yakin bahwa Anda ingin menambahkan file yang sedang Anda baca sebagai streaming, dan hanya ingin melakukan satu pass ini, pertimbangkan untuk menggunakan
sponge
darimoreutils
paket;sponge
membaca dari stdin ke memori hingga EOF, lalu membuang semua isinya ke stdout, sehinggased
akan mengenai bagian akhir file, berhenti membacanya, menutupnya, dan kemudian spons akan mulai menambahkannya.sumber
sponge
adalah utilitas bagus untuk tahu tentang, tetapised
sudah memiliki-i
pilihan:-i[SUFFIX], --in-place[=SUFFIX], edit files in place (makes backup if SUFFIX supplied)
.>>
, yang menambahkan, bukan>
yang menggantikan. Memang, OP telah secara khusus disebutkan-i
dalam pos dan sepertinya kasus penggunaan yang jauh lebih umum daripada yang satu ini, tapi saya pikir itu layak menunjukkan bahwa operasi OP tertentu telah diposting mungkin tanpa terlalu banyak faff, jika Anda benar-benar yakin itu yang ingin kamu lakukan.sponge
, lihatlahvipe
.moreutils
hanyalah sebuah paket ajaib yang diisi dengan hal-hal yang Anda tidak pernah tahu Anda butuhkansed
Perintah Anda sedang mencoba membaca file yang ditambahkannya. Ini tidak akan pernah mencapai End-Of-File, tetapi akan memakan banyak waktu CPU mencoba. Itu sebabnya ^ C (interrupt current process) ditemukan.sumber
Menambahkan kembali ke file yang Anda baca bukan ide yang baik, karena Anda akan berakhir dengan file yang terus bertambah. Jika Anda benar-benar ingin menulis kembali ke file Anda harus menggunakan
-i
flag:atau jika Anda ingin membuat cadangan sebelum melakukan perubahan Anda dapat menambahkan akhiran file ke
-i
bendera:Ini akan membuat file bernama
file.log.bak
dan kemudian melakukan perubahan, apa yang Anda lakukan di sana dengan mencoba menambahkan ke file yang Anda baca dari kami memanggil programmer gaul perlombaan data, di mana proses yang berbeda berlomba untuk sumber data yang sama baik itu input atau output . Ini juga mengapa mesin Anda berhenti.sumber
"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
seluruh proses di didtn sisi lain mereproduksi hasil dan ini pada mesin saya dan pada mesin dari pengguna lain. Tentu ada mekanisme yang dapat Anda gunakan untuk mematikan aplikasi yang tidak responsif, tetapi jika mesin Anda dianggap tidak responsif, Anda hanya memiliki satu opsi, mengatur ulang. Saya masih menguji ini dan sebelum saya tidak mengerti sepenuhnya apa yang menyebabkan perilaku yang dijelaskan, saya tidak dapat membahas bagian dari pertanyaan ini.sed
akan buffering semuanya ke dalam memori dan kemudian menutupnya, daripada tetap memegang pegangannya. Dengan file ~ 100MB, seperti pada OP, itu tumbuh tanpa batas tetapi tidak merusak mesin.