grep을 빠르게하기 위해 색인을 사용합니까?


10

나는 같은 코드베이스를 계속해서 모색하고 있습니다. 잘 작동하지만 각 명령은 약 10 초가 걸리므로 더 빨리 만드는 방법을 생각하고 있습니다.

grep어떤 종류의 인덱스를 사용할 수 있습니까? 인덱스가 복잡한 정규 표현식에 도움이되지 않을 것이라고 생각하지만 대부분 매우 간단한 패턴을 사용합니다. 이 경우 인덱서가 있습니까?

편집 : 나는 ctags 등에 대해 알고 있지만 전체 텍스트 검색을하고 싶습니다.


grep 또는 find / xargs와 같은 재귀 적 옵션을 사용하고 있습니까?
Michał Šrajer

@ Michał : 예, -R
Peltier

답변:


4

무엇에 대해 cscope를 ,이 신발을 일치 하는가?

다음에 대한 코드를 검색 할 수 있습니다.

  • 기호에 대한 모든 참조
  • 글로벌 정의
  • 함수에 의해 호출되는 함수
  • 함수를 호출하는 함수
  • 텍스트 문자열
  • 정규식 패턴
  • 파일
  • 파일을 포함한 파일

그것은 내가 찾고있는 것일 수 있습니다. 감사!
Peltier

그냥 C, 아마 C ++ 및 Java에서 잘 작동 것 같습니다
네 베스

4

전체 텍스트 인덱싱

recoll , swish-esphinx 와 같은 도구가 있지만 필요한 검색 기준을 지원할 수 있는지 확인해야합니다.

리콜

Recoll은 Unix / Linux 용 개인 전체 텍스트 검색 도구입니다.

스위시

Swish-e는 웹 페이지 또는 기타 파일 모음을 인덱싱하기위한 빠르고 유연하며 무료 인 오픈 소스 시스템입니다.

스핑크스

Sphinx를 사용하면 SQL 데이터베이스, NoSQL 스토리지 또는 파일에 빠르고 쉽게 파일을 일괄 색인화하고 검색 할 수 있습니다.

grep

grep이 설명하는 것처럼 느리다는 것에 놀랐습니다. 검색되는 파일 수를 줄일 수 있습니까? 예를 들어 하나의 실행 파일 (프로젝트의 많은 파일 중 하나)에 대해서만 소스 파일을 검색 해야하는 경우 해당 프로그램의 소스 파일을 나열하는 명령에서 grep에 이름을 제공합니다.

grep expression `sources myprogram`

sources 내 개발 환경에 특정한 프로그램이지만 동등한 것을 가지고 있거나 구성 할 수 있습니다.

나는 당신이 같은 명백한 기술을 시도했다고 가정합니다.

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

현재 옵션이 검색 속도를 크게 높일 수 있다는 제안 을 읽었 습니다.-Pgrep


1
AFAIK locate는 파일 이름 전용입니다. recoll은 작동하지만 명령 줄 도구를 선호합니다. 코드베이스는 꽤 커서 문자열을 찾고 있기 때문에 어디에 있는지 모릅니다. 따라서 검색 할 파일 수를 제한하기가 어렵습니다. :)
Peltier

swish-e는 커맨드 라인이라고 생각합니다. 나는 어떤 시도도하지 않았다 (나의 프로젝트에서 grep이 충분히 빠름)
RedGrittyBrick

3

grep, no. 그러나 색인을 사용하고 코드 기반을 목표로하는 여러 프로그램이 있습니다. ctags(vim과 함께 제공되는 버전이 있음), etags(emacs와 함께 사용하기 위해), global(편집기와 더 독립적 임)은 내가 지금 생각하고 있지만 다른 것일 수 있습니다.


ctags를 사용하지만 함수 이름 검색에만 국한되지 않습니까? 전체 텍스트 검색을하고 싶습니다.
펠티어

나는 ctag가 클래스 정의와 ISTR도 검색 할 수 있다고 확신합니다. 나는 글로벌이 두 가지 모두를 할 것이라고 확신합니다. 그러나 이러한 도구는 전체 텍스트 검색을 수행하지 않으며 언어 지식을 사용하여 범위를 제한하는 것이 사실입니다.
AProgrammer

2

코드베이스를 RAM 디스크에 복사 할 수 있습니다.


2

전체 텍스트 검색 엔진을 사용하려면 다음 중 하나를 사용하십시오.


그것은 항상 옵션이지만, 더 가볍고 빠르며 더러운 grep speedup 옵션이 있는지 궁금합니다.
Peltier

'더 가벼운'하지만 '내 물건을 완전히 색인화하고 싶습니다'는 2 가지 극단입니다. :) ctags는 빨리 더러운 것을 원한다면 원하는 것에 가장 적합합니다. 다른 모든 것들은 실제 전체 텍스트 검색 엔진을 사용하게됩니다. 예를 들어 @RedGrittyBrick 답변에 언급 된 'recoll'은 xapian을 백엔드로 사용합니다.
akira

1
반드시 호환되지 않는 것은 아닙니다. 예를 들어 ctags에 --full-text 옵션이 있고 --tag-file 옵션을 grep한다고 가정하십시오. 물론 그것이 존재할 수 있다는 사실이 그것이 의미하는 것은 아닙니다 :)
Peltier

-1

아니요, 그렇게 생각하지 않습니다. 그러나 간단한 해결책이있을 수 있습니다. 나는 기회를 주면 grep보다 훨씬 빠르며 더 나은 검색 결과를 얻기 위해 더 짧은 검색 문자열이 필요하며 많은 동일한 기능을 가지고 있지만 동일한 명령 스위치를 많이 사용합니다. 색인화하지는 않았지만 더 빠르게 만드는 한 가지 방법은 검색하지 않으려는 많은 것들을 무시한다는 것입니다. Perl로 작성되었으며 Perl의 정규 표현식을 사용하므로 Mac 및 Windows 포트도 있습니다.

http://betterthangrep.com/


Ack는 꽤 멋지다. 그러나 나는 그것이 동일한 메커니즘을 기반으로하기 때문에 grep보다 빠릅니다.
Peltier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.