Henüz teşhis edilmemiş bir uygulama hatası nedeniyle, tam diske sahip birkaç yüz sunucum var. Yinelenen satırlarla doldurulmuş bir dosya var - bir günlük dosyası değil, değişken tanımları olan bir kullanıcı ortamı dosyası (bu yüzden sadece dosyayı silemiyorum).
sedHatalı eklenen satırları kontrol etmek ve silmek için basit bir komut yazdım ve dosyanın yerel bir kopyasında test ettim. Amaçlandığı gibi çalıştı.
Ancak, tam disk ile sunucuda denediğimde, yaklaşık olarak aşağıdaki hatayı aldım (hafızadan değil, kopyalayıp yapıştırmadan):
sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname
Tabii ki boş yer kaldığını biliyorum . Bu yüzden bir şeyler silmeye çalışıyorum! (Kullandığım sedkomut 4000+ satır dosyasını yaklaşık 90 satıra indirecektir.)
Benim sedemrim sadecesed -i '/myregex/d' /path/to/file/filename
Tam diske rağmen bu komutu uygulayabilmemin bir yolu var mı?
(Otomatikleştirilmelidir, çünkü hızlı bir şekilde birkaç yüz sunucuya uygulamam gerekir.)
(Açıkçası uygulama hatası teşhis edilmesi gerekiyor, ancak bu arada sunucular düzgün çalışmıyor ....)
Güncelleme: Karşılaştığım durum, silebildiğimi öğrendiğim başka bir şeyi silerek çözüldü, ancak yine de gelecekte ve diğer insanlar için yararlı olacak bu sorunun cevabını istiyorum .
/tmphareketsizdir; aynı dosya sisteminde.
Disk alanını boşaltmadan önce vi, dosyayı açıp çalıştırarak satırları silebildiğimi test ettim :g/myregex/dve değişiklikleri başarıyla kaydettim :wq. Geçici bir dosyayı tutmak için ayrı bir dosya sistemine başvurmadan bunu otomatikleştirmek mümkün görünmektedir .... (?)
sed -iüzerinde çalışmak üzere geçici bir kopya oluşturur. Bunun ediçin daha iyi olacağından şüpheleniyorum , ancak gerçek bir çözümü yasaklayacak kadar tanıdık değilim
edkaçmayacağınızı: printf %s\\n g/myregex/d w q | ed -s infileama akılda tutmak gibi bazı uygulamaları da geçici dosyaları kullanmak sed(deneyebilirsin busybox ed - bu geçici bir dosya yaratmaz afaik)
echo. kullanın printf. ve sedson satırda bıraktığınız karakterleri ekleyin, böylece boşlukları kaybetmekten kaçının. Ayrıca, kabuğunuzun tüm dosyayı tek bir komut satırında işleyebilmesi gerekir. bu sizin riskiniz - önce test edin. bashözellikle kötü (onun w / yığın alan yapmak düşünüyorum?) ve her zaman size hasta olabilir. iki sed'si en azından çekirdeğin boru tamponunu aralarında iyi etki yaratacak şekilde kullanır, ancak yöntem oldukça benzerdir. komut alt öğeniz filesed w / in öğesinin başarılı olup olmadığını da keser .
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}ve çalışırsa cevabımın geri kalanını okuyun. '