Menggunakan indeks untuk membuat grep lebih cepat?

10

Saya menemukan diri saya memahami basis kode yang sama berulang-ulang. Meskipun bekerja dengan baik, setiap perintah membutuhkan waktu sekitar 10 detik, jadi saya memikirkan cara untuk membuatnya lebih cepat.

Jadi dapatkah grepmenggunakan semacam indeks? Saya mengerti indeks mungkin tidak akan membantu regexps yang rumit, tetapi saya menggunakan sebagian besar patters yang sangat sederhana. Apakah ada pengindeks untuk kasus ini?

EDIT: Saya tahu tentang ctag dan sejenisnya, tapi saya ingin melakukan pencarian teks lengkap.

Peltier
sumber
Apakah Anda menggunakan opsi rekursif untuk grep atau beberapa find / xargs like way?
Michał Šrajer
@ Michał: ya, -R
Peltier

Jawaban:

4

bagaimana dengan cscope , apakah ini cocok dengan sepatu Anda?

Mengizinkan kode penelusuran untuk:

  • semua referensi ke simbol
  • definisi global
  • fungsi yang disebut oleh suatu fungsi
  • fungsi memanggil fungsi
  • string teks
  • pola ekspresi reguler
  • file
  • file termasuk file
akira
sumber
Itu bisa menjadi apa yang saya cari, saya akan memeriksanya. Terima kasih!
Peltier
Sepertinya hanya berfungsi dengan baik untuk C, mungkin C ++ dan Java
neves
4

Pengindeksan teks lengkap

Ada alat seperti recoll , swish -e dan sphinx tetapi Anda harus memeriksa apakah mereka dapat mendukung jenis kriteria pencarian yang Anda butuhkan.

Ingat

Recoll adalah alat pencarian teks lengkap pribadi untuk Unix / Linux.

Swish-e

Swish-e adalah sistem open source yang cepat, fleksibel, dan gratis untuk mengindeks koleksi halaman Web atau file lainnya.

Sphinx

Sphinx memungkinkan Anda melakukan batch index dan mencari data yang disimpan dalam database SQL, penyimpanan NoSQL, atau hanya file dengan cepat dan mudah

grep

Saya terkejut grep selambat yang Anda jelaskan, dapatkah Anda mengurangi jumlah file yang dicari? Sebagai contoh ketika saya hanya perlu mencari file sumber untuk satu yang dapat dieksekusi (dari banyak dalam proyek) saya memberi makan grep nama-nama dari perintah yang mencantumkan file sumber untuk program itu:

grep expression `sources myprogram`

sources adalah program khusus untuk lingkungan pengembangan saya tetapi Anda mungkin memiliki (atau dapat membangun) sesuatu yang setara.

Saya berasumsi Anda sudah mencoba teknik yang jelas seperti

find /foo/myproject -name "*.c" -exec fgrep -l searchtext

Saya telah membaca saran bahwa -Popsi saat ini grepdapat mempercepat pencarian secara signifikan.

RedGrittyBrick
sumber
1
Lokasi AFAIK hanya untuk nama file. Recoll akan bekerja, tapi saya lebih suka alat baris perintah. Basis kode cukup besar, dan karena saya sedang mencari string, saya tidak tahu di mana itu, jadi sulit untuk membatasi jumlah file yang akan dicari :)
Peltier
Saya pikir swish-e adalah command-line. Saya belum pernah mencoba (grep cukup cepat pada proyek saya)
RedGrittyBrick
3

grep, tidak. Tetapi ada beberapa program yang menggunakan indeks dan ditujukan untuk basis kode. ctags(ada versi yang disediakan dengan vim), etags(ditujukan untuk digunakan dengan emacs), global(lebih independen dari editor) adalah yang saya pikirkan sekarang tetapi mungkin ada yang lain.

Pemrogram
sumber
Saya menggunakan ctag, tetapi bukankah itu terbatas pada pencarian nama fungsi? Saya ingin melakukan pencarian teks lengkap.
Peltier
Saya cukup yakin bahwa ctag juga dapat mencari definisi kelas dan ISTR yang juga digunakan. Saya yakin bahwa global melakukan keduanya. Tetapi memang benar bahwa alat-alat itu tidak melakukan pencarian teks lengkap dan menggunakan pengetahuan bahasa untuk membatasi ruang lingkup mereka.
Pemrogram
3

Anda dapat menyalin basis kode Anda pada disk RAM.

jfg956
sumber
2

jika Anda ingin menggunakan mesin pencarian teks lengkap .. gunakan satu:

akira
sumber
Itu selalu merupakan pilihan, tetapi saya bertanya-tanya apakah opsi kecepatan grep yang lebih ringan, cepat dan kotor akan ada.
Peltier
'lebih ringan' tetapi 'ingin memiliki barang-barang saya sepenuhnya diindeks' adalah sedikit 2 ekstrem :) ctags adalah yang terbaik untuk apa yang Anda inginkan, jika Anda hanya ingin cepat dan kotor. dengan segala sesuatu yang Anda akhirnya menggunakan mesin fulltext-search-nyata. misalnya, 'recoll' yang disebutkan dalam jawaban @RedGrittyBrick menggunakan xapian sebagai backend.
akira
1
Mereka belum tentu tidak kompatibel. Bayangkan jika ctag memiliki opsi --full-text, misalnya, dan ambil opsi --tag-file. Tentu saja fakta bahwa itu bisa ada bukan berarti ya :)
Peltier
-1

Tidak, kurasa tidak. Tetapi mungkin ada solusi sederhana: Coba ack. Saya pikir jika Anda memberinya kesempatan, Anda akan menemukannya secara signifikan lebih cepat daripada grep, membutuhkan string pencarian yang lebih pendek untuk mendapatkan hasil pencarian yang lebih baik, dan memiliki banyak fitur yang diinginkan, sambil menggunakan banyak perintah yang sama. Satu hal yang membuatnya lebih cepat (walaupun tidak diindeks) adalah ia mengabaikan lebih banyak hal yang tidak ingin Anda cari. Ini ditulis dalam Perl dan menggunakan ekspresi reguler Perl (dan karena itu juga memiliki port Mac dan Windows, juga).

http://betterthangrep.com/

Mike dari Shreveport
sumber
Ack cukup keren. Tapi saya benar-benar ragu itu lebih cepat daripada grep, karena didasarkan pada mekanisme yang sama.
Peltier