PV (Boru Görüntüleyicisi) Kullanarak Grep İlerleme Çubuğu


11

Bilgisayarımda büyük bir dizin var ve bir dize için içindeki her yakut dosyayı aramak gerekir.

Bunu şu şekilde yapabilirdim: grep -R "string" *.rbama gerçekten çok uzun sürüyor ve ilerlemeyi izlemek için bir ilerleme çubuğu göstermek için pv (boru görüntüleyici) kullanmak istiyorum grep.

Ama bu komutu nasıl yazabileceğimi gerçekten bilmiyorum çünkü hala bu komut hakkında anlayamadığım bazı şeyler var.

Birinin bir fikri var mı?

Yanıtlar:


15

pvborular üzerinde çalışır (komutlar değil) - Boru hattında belirli bir noktadan ne kadar verinin geçtiğini gösteren bir hacim ölçerdir.
Grep komutunuz bir ardışık düzen değildir ( |- pipe operatorbulunacak hiçbir yer yoktur) - işini yapan tek bir komuttur. pvburada size yardımcı olamaz, sadece greptüm girdi dosyaları üzerinde bir şey yapıyor güveniyorum .

Sen olabilir bulmak, pv, Xargs & grep (ile birlikte bir şeyler cobble find . -name "*.rb" | pv | xargs grep [regex]böyle görünüyor ufuklar açabilir, ancak anlatmak zorunda kalacak pvkadar büyük findo anlamlı sonuçlar vermek için çıkıştır.

Açıkçası, değerinden daha fazla iş gibi görünüyor. Sadece grep'inizi çalıştırın, sabırla bekleyin ve bittiğinde çıktıyla ilgilenin.


1
Kesinlikle mümkün , sadece kıvrık ve muhtemelen
grep'in

1
Gerçekten güzel bir pasaj olabilir: p
Cydonia7 19

4

İki yöntem daha:

for file in *.rb; do echo $file; grep "string" $file >> output.txt; done

Veya, orijinal komutunuz çalışırken farklı bir kabukta, grep komutunun pid'ini bulun ve ardından:

strace -q -s 256 -e trace=open -p [pid] 2>&1 | head

Yukarıdakilerin her ikisi de grep komutunun şu anda hangi dosya üzerinde çalıştığını gösterecektir. Toplam dosya sayısını şununla bulabilirsiniz:

ls -l *.rb | wc -l

Son olarak, geçerli dosyanın listede hangi sayı olduğunu bulmak için bunu kullanın:

ls -l *.rb | grep -n [the current filename]

PS Yanıtlarım, tüm dosyalarınızın tek bir dizinde olduğunu varsayar. Değilse, önerilen ve findyerine önerilen olarak kullanmak zorunda kalacaksınız.ls*.rb


1
Bu güzel bir alternatif
Cydonia7

1

Hangi işletim sistemini kullandığınızdan emin değilim, ancak grep -R "string" *.extsizin için düzgün çalışmıyor olabilir.

findAşağıdakilerle bağlantılı olarak kullanarak daha iyi hizmet alabilirsiniz grep:

find . -type f -name "*.rb" -print0 |xargs --null grep "string"


Doğru, verdiğim komut aslında Fedora 16 üzerinde çalışıyor, ancak sizinki daha net. Teşekkür ederim !
Cydonia7

1

Son sürümlerinde pvbir orada "-d"başka sürecinin tüm FDS izlemek için -Seçeneği.

Yani teoride pvsadece bir boru olarak değil, aynı zamanda tüm bir süreç için bir ilerleme göstergesi olarak da çalışacaktır. (Örneğin, Firefox'unuzun PID'sini deneyin)

Yukarıdaki Sorun için daha basit bir fikir şudur: Çalışırken ile birlikte grepkullanın .lsofwatch

$ watch -n 1 "lsof | grep -n $PWD"

Bu şekilde grep'inizin ilerlemesini izleyebilirsiniz.


0

Zaten denedin mi

grep -R "string" *.rb | pv

Gerçekte işe yarayıp yaramadığını bilmiyorum çünkü yinelenen olduğu için toplam veri bitlerinin kaç bitini bilmiyor?


4
- Bu ne istediğini yapacak sanmıyorum pvo tam giriş boyutu belirtilen bu yüzden bile (grep çıkışında faaliyet gösteriyor olacaktır pvIt olacak - sadece çıkış borusunun ucunu çıkan görür yolu altında sayma bayt
voretaq7

0

Genellikle proc-dosya sistemini Linux sistemlerinde kullanıyorum, yani

ls -al /proc/<pid of grep>/fd

Bu, grep-invocation'ın şu anda açık olduğu tüm dosyaları listeler ve böylece aramada şu anda nerede olduğu hakkında bir izlenim verir.

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.