Büyük bir günlük dosyasında grep (> 14 GB) sadece son x GB?


34

Büyük bir günlük dosyasında (14 GB'den büyük) bir şey aramam gerekiyor. Son 4 GB’de ya da öylesine olduğundan eminim.

İşleri hızlandırmak için ilk X GB'yi atlamanın bir yolu var mı?


7
LC_ALL=C grephızlandırabilir.
jfs

1
Mantıklı bir grepifade seçerek çok fazla hız kazanabilirsiniz ... Bilinmeyen uzunlukta joker karakterler ( a.*thingbazı durumlarda) değerlendirmek daha uzun sürebilir. Yanlış bir şeyi optimize ediyor olabilirsiniz (dosyanın yalnızca bir kısmını aramaktan asla zarar vermese de, belli ki - en büyük hızlandırma kaynağı olmayabilir).
Floris,

Yanıtlar:


75

Kullanabileceğin tahmin kuyruk kullanarak son 4GB tek çıkış ya da öylesine için -canahtarı

-c, --bytes = [+] NUM
, son NUM bayt sayısını verir; veya her dosyanın bayt NUM'undan başlayarak çıktı almak için -c + NUM kullanın.

Muhtemelen bir şeyler yapabileceğini gg de ayarlayarak bs=1ve skipkarşı ing sen ör başlatmak istiyor ofset

dd if=file bs=1024k skip=12g | grep something

83
Daha sonra logrotate'i yapılandırmalısınız.
Gerald Schneider

3
@Rogier Lütfen sorunuza eklemek yerine çözüme bir cevap ekleyin. Bu, kendi kendine yanıtlamaya benzer: serverfault.com/help/self-answer
AL

5
@istheEnglishway: Evet, hayır, farklı bir komut gönderdiler.
Monica

11
Ancak cevabınız, katma değer olan bu çözümü uygulayan gerçek emri vermez. Bunu cevabınıza düzenleyebilirsiniz veya OP yeni bir cevap olarak gönderebilir. Kesinlikle, soruyu eklememeliydi, ki olan buydu. Ve kesinlikle “burnunu sokmak” gibi epitellerin etrafına atmamalısın.
Monica

7
@istheEnglishway, bir örneğe sahip olmanın bir örneğini, bir man sayfasını okumak zorunda bırakmaktan daha kolay hale getirdiğine inanıyorum (ayrıca bakınız: stackoverflow belgelerine)
Pierre.Sassoulas

32

Bunu gönderiyorum çünkü yorumlardan bazıları bunun için istedi.

Son kullandığım şey ise (15 GB dosya). Çok hızlı çalıştı ve bana bir sürü zaman kazandırdı.

tail -f -c 14G file | grep something

Aynı dosya üzerinde çok temel bir değerlendirme yaptım. Test ettim:

grep xxx dosyası
// sonsuza dek sürdü (> 5 dakika)

dd if = dosya bs = 1 atla = 14G | grep xxx
// çok hızlı <1 sn

kuyruk -c 14g | grep xxx
// oldukça hızlı <2 sn

tailsadece biraz daha kısadır.

Not: son ek kullanılır gve Gkomutu yerine (15.10 Ubuntu) farklıdır


Kriterler arasındaki disk önbelleğini temizlediniz mi? İlkinde çoğu zaman G / Ç olduğundan şüpheleniyorum. Hızlanma 300 × değil, 15 × olmalıdır.
Reid,

2
@Reid yapmadım. Ancak her komutu birden çok kez çalıştırdım . Im oldukça emin dd veya kuyruk hızını artıracak önemli ölçüde üzerinde sadece grep (önbelleği veya değil).
Roger,

19

Bu, Başlık sorusuna cevap vermiyor, ama ne yapmak istiyorsan onu yapacak. Dosyayı ters çevirmek için tac komutunu kullanın, ardından dizginizi bulmak için grep kullanın. Dizeniz dosyada yalnızca bir kez veya bilinen bir sayıda meydana gelirse, bilinen oluşum sayısını bulana kadar çalışmasına izin verin. Bu şekilde, dosyanın neresinde olduğu hakkındaki varsayımınız yanlışsa, yine de onu bulacaktır. Sınırlamak istiyorsanız, bunu yapmak için kafa kullanabilirsiniz. Baş komut, tak ve grep arasında giderdi.

Böylece komut şöyle görünür:

tac < logfile | grep myString

1
Buraya aynı cevabı yazmak için geldim. Hiç kimsenin seninkini almadığına şaşırdım.
Dmitry Grigoryev

2
Bana bir dakika sürdü, ama sonra sersemlemiş oldum ... tac, kedinin tersi.
Sammi

1
Bir uygulama / hata ayıklama günlüğünde dolaşmam gerekiyordu . Satırları tersine çevirdiği için okunması kolay olmuyor ;-) Ancak çok hızlı görünüyor. Hiç görmedim tac, çok teşekkürler!
Roger,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.