Sử dụng một chỉ mục để làm cho grep nhanh hơn?


10

Tôi thấy mình đang lặp đi lặp lại cùng một codebase. Mặc dù nó hoạt động rất tốt, mỗi lệnh mất khoảng 10 giây, vì vậy tôi đang suy nghĩ về các cách để làm cho nó nhanh hơn.

Vì vậy, có thể grepsử dụng một số loại chỉ số? Tôi hiểu rằng một chỉ mục có thể sẽ không giúp ích cho các biểu thức phức tạp, nhưng tôi sử dụng các phần tử rất đơn giản. Có một chỉ mục tồn tại cho trường hợp này?

EDIT: Tôi biết về ctags và những thứ tương tự, nhưng tôi muốn tìm kiếm toàn văn.


Bạn có đang sử dụng oprtion đệ quy cho grep hoặc một số find / xargs như cách không?
Michał rajer

@ Michał: có, -R
Peltier

Câu trả lời:


4

Điều gì về cscope , điều này có phù hợp với đôi giày của bạn?

Cho phép tìm kiếm mã cho:

  • tất cả các tham chiếu đến một biểu tượng
  • định nghĩa toàn cầu
  • các hàm được gọi bởi một hàm
  • chức năng gọi một chức năng
  • chuỗi văn bản
  • mẫu biểu thức chính quy
  • một tập tin
  • tập tin bao gồm một tập tin

Đó có thể là những gì tôi đang tìm kiếm, tôi sẽ xem xét. Cảm ơn!
Peltier

Có vẻ như nó chỉ hoạt động tốt cho C, có thể là C ++ và Java
neves

4

Lập chỉ mục toàn văn

Có các công cụ như recoll , swish-esphinx nhưng bạn phải kiểm tra xem chúng có thể hỗ trợ loại tiêu chí tìm kiếm bạn cần không.

Nhớ lại

Recoll là một công cụ tìm kiếm toàn văn bản cá nhân cho Unix / Linux.

Swish-e

Swish-e là một hệ thống nguồn mở nhanh, linh hoạt và miễn phí để lập chỉ mục các bộ sưu tập các trang Web hoặc các tệp khác.

Nhân sư

Sphinx cho phép bạn lập chỉ mục hàng loạt và tìm kiếm dữ liệu được lưu trữ trong cơ sở dữ liệu SQL, lưu trữ NoQuery hoặc chỉ các tệp nhanh chóng và dễ dàng

grep

Tôi ngạc nhiên grep chậm như bạn mô tả, bạn có thể giảm số lượng tệp được tìm kiếm không? Ví dụ: khi tôi chỉ cần tìm kiếm các tệp nguồn cho một tệp thực thi (trong số nhiều tệp trong một dự án) Tôi cung cấp grep các tên từ một lệnh liệt kê các tệp nguồn cho chương trình đó:

grep expression `sources myprogram`

sources là một chương trình dành riêng cho môi trường phát triển của tôi nhưng bạn có thể có (hoặc có thể xây dựng) một cái gì đó tương đương.

Tôi cho rằng bạn đã thử các kỹ thuật rõ ràng như

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

Tôi đã đọc một đề nghị rằng -Ptùy chọn hiện tại grepcó thể tăng tốc đáng kể các tìm kiếm.


1
Định vị AFAIK chỉ dành cho tên tệp. recoll sẽ hoạt động, nhưng tôi thích một công cụ dòng lệnh. Cơ sở mã khá lớn và vì tôi đang tìm kiếm một chuỗi, tôi không biết nó ở đâu, vì vậy thật khó để giới hạn số lượng tệp được tìm kiếm :)
Peltier

Tôi nghĩ swish-e là dòng lệnh. Tôi chưa thử bất kỳ (grep là đủ nhanh trong các dự án của tôi)
RedGrittyBrick

3

grep, không Nhưng có một số chương trình sử dụng các chỉ mục và nhắm vào cơ sở mã. ctags(có một phiên bản được cung cấp với vim), etags(nhằm mục đích sử dụng với emacs), global(độc lập hơn với trình chỉnh sửa) là phiên bản tôi đang nghĩ đến bây giờ nhưng có lẽ có khác.


Tôi sử dụng ctags, nhưng không giới hạn trong việc tìm kiếm tên hàm? Tôi muốn làm tìm kiếm toàn văn.
Peltier

Tôi khá chắc chắn rằng ctag cũng có thể tìm kiếm định nghĩa lớp và ISTR mà nó cũng tìm thấy một số sử dụng. Tôi chắc chắn rằng toàn cầu làm cả hai. Nhưng sự thật là những công cụ đó không thực hiện tìm kiếm toàn văn bản và đang sử dụng kiến ​​thức ngôn ngữ để giới hạn phạm vi của chúng.
AProgrammer

3

Bạn có thể sao chép cơ sở mã của mình trên đĩa RAM.


2

nếu bạn muốn sử dụng công cụ tìm kiếm toàn văn bản .. hãy sử dụng một:


Đó luôn là một lựa chọn, nhưng tôi đã tự hỏi liệu một tùy chọn tăng tốc grep nhẹ, nhanh và bẩn hơn sẽ tồn tại.
Peltier

'nhẹ hơn' nhưng 'muốn có công cụ của tôi được lập chỉ mục đầy đủ' là một chút của hai thái cực :) ctags là kết hợp tốt nhất cho những gì bạn muốn, nếu bạn chỉ muốn nhanh chóng làm bẩn. với mọi thứ khác bạn kết thúc bằng cách sử dụng một công cụ tìm kiếm toàn văn bản thực sự. ví dụ: 'recoll' được đề cập trong câu trả lời @RedGrittyBrick đang sử dụng xapian làm phụ trợ.
akira

1
Chúng không nhất thiết không tương thích. Ví dụ, hãy tưởng tượng nếu ctags có tùy chọn --full-text và grep tùy chọn --tag-file. Tất nhiên thực tế là nó có thể tồn tại không có nghĩa là như vậy :)
Peltier

-1

Không, tôi không nghĩ vậy. Nhưng có thể có một giải pháp đơn giản: Hãy thử ack. Tôi nghĩ rằng nếu bạn cho nó một cơ hội, bạn sẽ thấy nó nhanh hơn đáng kể so với grep, yêu cầu các chuỗi tìm kiếm ngắn hơn để có kết quả tìm kiếm tốt hơn và có nhiều tính năng mong muốn, trong khi sử dụng nhiều công tắc lệnh tương tự. Một điều làm cho nó nhanh hơn (mặc dù không được lập chỉ mục) là nó bỏ qua rất nhiều thứ mà bạn không muốn tìm kiếm. Nó được viết bằng Perl và sử dụng các biểu thức chính quy của Perl (và do đó cũng có các cổng Mac và Windows).

http://betterthangrep.com/


Ack khá tuyệt. Nhưng tôi thực sự nghi ngờ nó nhanh hơn grep, vì nó dựa trên cùng một cơ chế.
Peltier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.