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 sed
perintah 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! ( sed
Perintah yang saya gunakan akan mengurangi 4000 baris file menjadi sekitar 90 baris.)
sed
Perintah 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.
/tmp
adalah no-go; ada di sistem file yang sama.
Sebelum saya membebaskan ruang disk, saya melakukan pengujian dan menemukan bahwa saya dapat menghapus baris vi
dengan membuka file dan menjalankan :g/myregex/d
dan kemudian berhasil menyimpan perubahan dengan :wq
. Tampaknya mungkin untuk mengotomatisasi ini, tanpa menggunakan sistem file terpisah untuk menyimpan file temp .... (?)
sed -i
membuat salinan sementara untuk beroperasi. Saya menduga itu ed
akan lebih baik untuk ini, meskipun saya tidak cukup akrab untuk melarang solusi yang sebenarnya
ed
Anda menjalankan: printf %s\\n g/myregex/d w q | ed -s infile
tetapi 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 sed
tambahkan 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. bash
sangat buruk pada saat itu (saya pikir itu untuk melakukan ruang w / stack?) dan mungkin sakit pada Anda setiap saat. kedua yang sed
direkomendasikan setidaknya akan menggunakan buffer pipa kernel untuk efek yang baik di antara mereka, tetapi metode ini cukup mirip. Sub perintah Anda juga akan memotong file
apakah sed tidak berhasil.
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}
dan jika berhasil baca sisa jawaban saya. '