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).
sed
Hatalı 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 sed
komut 4000+ satır dosyasını yaklaşık 90 satıra indirecektir.)
Benim sed
emrim 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 .
/tmp
hareketsizdir; aynı dosya sisteminde.
Disk alanını boşaltmadan önce vi
, dosyayı açıp çalıştırarak satırları silebildiğimi test ettim :g/myregex/d
ve 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 ed
için daha iyi olacağından şüpheleniyorum , ancak gerçek bir çözümü yasaklayacak kadar tanıdık değilim
ed
kaçmayacağınızı: printf %s\\n g/myregex/d w q | ed -s infile
ama 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 sed
son 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 file
sed 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. '