Grep progress bar menggunakan pv (penampil pipa)

11

Saya punya direktori besar di komputer saya dan saya perlu mencari di setiap file ruby ​​untuk mencari string.

Saya bisa melakukannya seperti ini: grep -R "string" *.rbtetapi butuh waktu sangat lama dan saya ingin menggunakan pv (penampil pipa) untuk menunjukkan progress bar untuk dapat memantau grepkemajuan.

Tetapi saya tidak benar-benar tahu bagaimana saya bisa menulis perintah ini karena masih ada beberapa hal yang saya tidak mengerti tentang perintah ini.

Adakah yang punya ide?

Cydonia7
sumber

Jawaban:

15

pvberoperasi pada pipa (bukan perintah) - Ini adalah pengukur volume yang menunjukkan berapa banyak data yang melewati titik tertentu dalam pipa.
Perintah grep Anda bukan pipa ( |- pipe operatortidak ada tempat untuk ditemukan) - itu hanya satu perintah melakukan hal itu. pvtidak dapat membantu Anda di sini, Anda hanya perlu percaya bahwa grepsebenarnya melakukan hal itu pada semua file input.

Anda dapat mengacaukan sesuatu bersama dengan find, pv, xargs & grep ( find . -name "*.rb" | pv | xargs grep [regex]sepertinya itu menjanjikan, tetapi Anda harus mengatakan pvseberapa besar findoutput untuk itu untuk memberikan hasil yang bermakna.

Terus terang sepertinya lebih banyak pekerjaan daripada nilainya. Jalankan saja grep Anda, tunggu dengan sabar , dan tangani hasilnya setelah selesai.

voretaq7
sumber
1
Ini benar-benar mungkin , itu hanya berbelit-belit dan mungkin akan membutuhkan waktu lebih lama untuk disatukan dan mulai bekerja daripada hanya menunggu grep selesai :-)
voretaq7
1
Bisa jadi cuplikan yang sangat bagus: p
Cydonia7
4

Dua metode lagi:

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

Atau, di shell yang berbeda saat perintah asli Anda sedang berjalan, cari pid dari perintah grep dan kemudian:

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

Kedua hal di atas akan menunjukkan file grep yang sedang Anda kerjakan. Anda dapat menemukan jumlah total file dengan:

ls -l *.rb | wc -l

Terakhir, gunakan ini untuk mencari tahu nomor mana file saat ini dalam daftar:

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

PS Jawaban saya berasumsi bahwa semua file Anda berada dalam satu direktori. Jika mereka tidak, Anda akan harus menggunakan findbukannya lsdan *.rbsebagai thinice disarankan.

Ladadadada
sumber
1
Itu alternatif yang bagus
Cydonia7
1

Saya tidak yakin OS apa yang Anda gunakan, tetapi grep -R "string" *.extmungkin tidak berfungsi dengan benar untuk Anda.

Anda mungkin lebih baik dilayani menggunakan findbersama grep:

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

es tipis
sumber
Benar, perintah yang saya berikan benar-benar berfungsi pada Fedora 16 tetapi Anda lebih jelas. Terima kasih !
Cydonia7
1

Dalam versi terbaru pvada "-d"-Opsi untuk menonton semua FD dari proses lain.

Jadi secara teori pvtidak hanya akan berfungsi sebagai pipa tetapi juga sebagai indikator kemajuan untuk keseluruhan proses. (Misalnya, coba dengan PID Firefox Anda)

Untuk Masalah di atas, ide yang lebih sederhana adalah sebagai berikut: Saat grepsedang berjalan, gunakan lsofbersama-sama dengan watch.

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

Dengan begitu Anda bisa memantau perkembangan grep Anda.

Jan Walzer
sumber
0

Sudahkah Anda mencoba

grep -R "string" *.rb | pv

Saya tidak tahu apakah ini benar-benar berfungsi karena tidak tahu berapa banyak bit total data yang harus dicari karena bersifat rekursif?

nhutto
sumber
4
Saya tidak berpikir ini akan melakukan apa yang dia inginkan - pvakan beroperasi pada output grep (jadi bahkan jika ia menentukan ukuran input penuh pvhanya melihat output keluar dari ujung pipa - Ini akan menjadi jalan di bawah -menghitung byte
voretaq7
0

Saya biasanya menggunakan sistem proc-files pada sistem Linux, yaitu

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

Ini mencantumkan semua file yang telah dibuka grep-invocation saat ini dan dengan demikian memberikan kesan di mana dalam pencarian itu saat ini.

centic
sumber