Karena bug aplikasi belum terdiagnosis, saya memiliki beberapa ratus server dengan disk penuh. Ada satu file yang telah diisi dengan duplikat baris - bukan file log, tetapi file lingkungan pengguna dengan definisi variabel (jadi saya tidak bisa hanya menghapus file).
Saya menulis sedperintah sederhana untuk memeriksa baris yang ditambahkan secara salah dan menghapusnya, dan mengujinya pada salinan lokal file tersebut. Ini berfungsi sebagaimana dimaksud.
Namun, ketika saya mencobanya di server dengan disk penuh, saya mendapatkan kira-kira kesalahan berikut (ini dari memori, bukan salin dan tempel):
sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname
Tentu saja, saya tahu tidak ada ruang yang tersisa. Itu sebabnya saya mencoba menghapus barang! ( sedPerintah yang saya gunakan akan mengurangi 4000 baris file menjadi sekitar 90 baris.)
sedPerintah saya adilsed -i '/myregex/d' /path/to/file/filename
Apakah ada cara saya dapat menerapkan perintah ini meskipun disk penuh?
(Ini harus otomatis, karena saya perlu menerapkannya ke beberapa ratus server sebagai perbaikan cepat.)
(Jelas bug aplikasi perlu didiagnosis, tetapi sementara itu server tidak berfungsi dengan benar ....)
Pembaruan: Situasi yang saya hadapi diselesaikan dengan menghapus sesuatu yang saya temukan dapat saya hapus, tetapi saya masih menginginkan jawaban untuk pertanyaan ini , yang akan membantu di masa depan dan untuk orang lain.
/tmpadalah no-go; ada di sistem file yang sama.
Sebelum saya membebaskan ruang disk, saya melakukan pengujian dan menemukan bahwa saya dapat menghapus baris videngan membuka file dan menjalankan :g/myregex/ddan kemudian berhasil menyimpan perubahan dengan :wq. Tampaknya mungkin untuk mengotomatisasi ini, tanpa menggunakan sistem file terpisah untuk menyimpan file temp .... (?)
sed -imembuat salinan sementara untuk beroperasi. Saya menduga itu edakan lebih baik untuk ini, meskipun saya tidak cukup akrab untuk melarang solusi yang sebenarnya
edAnda menjalankan: printf %s\\n g/myregex/d w q | ed -s infiletetapi perlu diingat beberapa implementasi juga menggunakan file sementara seperti sed(Anda dapat mencoba busybox ed - afaik itu tidak membuat file sementara)
echo. gunakan printf. dan sedtambahkan beberapa char yang kamu jatuhkan di baris terakhir agar kamu tidak kehilangan trailing blank. juga, shell Anda harus dapat menangani seluruh file dalam satu baris perintah. itu risiko Anda - tes dulu. bashsangat buruk pada saat itu (saya pikir itu untuk melakukan ruang w / stack?) dan mungkin sakit pada Anda setiap saat. kedua yang seddirekomendasikan setidaknya akan menggunakan buffer pipa kernel untuk efek yang baik di antara mereka, tetapi metode ini cukup mirip. Sub perintah Anda juga akan memotong fileapakah sed tidak berhasil.
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}dan jika berhasil baca sisa jawaban saya. '