배쉬 : 파일 디렉토리에서 특정 문자열을 검색하는 방법이 있습니까? [복제]


47

가능한 중복 :
리눅스에서 텍스트 패턴 검색

bash에서는 찾고있는 특정 문자열이 현재 디렉토리에있는 파일 내에 있는지 여부를 알려주는 명령이 있는지 궁금합니다.

현재 디렉토리의 C 파일 세트에서 'toUpperCase ()'함수를 찾고 있다고 가정하십시오. 많은 파일이 있으므로 vim을 사용하여 각 파일을 수동으로 열고 문자열 'toUpperCase'를 확인하는 데 시간이 오래 걸리기 때문에 원하지 않습니다. bash 명령 줄이 아닌 경우이 작업을 효율적으로 수행하는 다른 방법이 있습니까?

답변:


64

grep:

grep -R "toUppercase()" *

또는 ack-grep을 설치 한 경우 간단히 다음을 수행하십시오.

ack-grep "toUppercase"

C 파일에서 검색을 제한하려면 ack-grep다음을 사용하십시오 .

ack-grep -cc "toUppercase()"

ack-grepOSX에 설치할 수도 있지만 실행 파일을 그냥 호출 ack합니다.


SO가 이미 의심 할 여지없이 비슷한 질문을 가지고 있도록 ;)
David Perry

10

표준 텍스트 검색 도구는 grep 입니다.

현재 디렉토리의 toUpperCase(모든 .c파일에서 문자열을 찾으려면 다음을 수행하십시오 .

grep -F 'toUpperCase(' *.c

서브 디렉토리도 보려는 경우 :

grep -r --include='*.c' -F 'toUpperCase('

C 함수 호출을 찾고 있다면 ctags 가 더 적합 할 수 있습니다. 모든 소스 파일에서 한 번 실행하여 식별자 색인을 생성 한 다음 편집기를 사용하여 호출 간을 탐색합니다. 모든 vi-like 편집기는 ctags TAGS파일을 사용할 수 있습니다 . Emacs를 사용하는 경우 유사한 프로그램을 실행하십시오 etags.


ctags함수 호출이 아닌 함수 정의 를 찾는 데 유용 합니다 .
JdeBP

6

vim을 사용하고 있습니다. 이 작업을 수행 할 수있는 도구가 있습니다.

예상대로 이미 사용하겠다고 말하는 7 가지 답변이 있습니다 grep. 그러나 나는 지금까지 당신이 사용하고 있다는 당신의 질문에서 눈치 채신 유일한 사람인 것 같습니다 vim. 따라서 에서 사용할 있지만 내장 도구 를 사용할 수도 있습니다 . 이것은 명령을 통해 호출됩니다 . grepvimvim:vimgrep

"함수 호출에 대한 현재 디렉토리에있는 C 소스 파일을 모두 검색하려면 toUpperCase()하나 개의 유형은" vim명령

:vimgrep "\<toUpperCase\_s*(" *.c

일치하는 결과 목록이 빠른 수정 사항 목록에 자동으로로드되고 다음 중 하나를 사용하여 액세스 할 수 있습니다 (미묘한 차이는 온라인 도움말 참조).

:copen
:cwin

함수 정의 를 호출하는 것이 아니라 함수 정의 를 찾는 것은 or 명령 과 함께 answerctags 에서 언급 한대로 도구 입니다.Gilles:tjump:tselect

왜 사용 :vimgrep합니까?

온라인 도움말 ( :help grep)은 몇 가지 이유를 설명합니다. 더 나아가 그 행동 :vimgrepdietbuddha 의 행동을 비교하십시오 . dietbuddha의 명령 행 grep은 각 개별 C 소스 파일에 대한 개별 프로세스를 분기 합니다. xargs오버 헤드를 줄이기 위해 사용되지도 않습니다 . 그리고 일단 완료되면 관련 소스 파일에서 텍스트 편집기를 호출하기 위해 어떻게 든 출력을 구문 분석해야합니다. :vimgrep여러 개의 추가 프로세스를 전혀 수행하지 않으며 결과를 사용하는 것이 간단합니다. 결과 빠른 수정 사항 목록에서 항목 중 하나를 선택하기 만하면 관련 소스 파일의 관련 행에 커서가 자동으로 배치됩니다.

실제로 자동으로 제외하고 손으로 직접 작성한 것을 수행합니다. 바로 텍스트 편집기 작업을 수행하는 자동화 된 방법입니다. 직접로드 한 것처럼 파일을로드하고 이미 다른 곳에서 사용중인 것과 동일한 정규식 구문을 사용하여 정규식을 검색하고 vim일치하는 위치를 기록한 다음 파일을 언로드합니다.


2

예, 도구는이라고 grep합니다.

grep 명령은 하나 이상의 입력 파일에서 지정된 패턴과 일치하는 행을 찾습니다. 기본적으로 grep은 일치하는 줄을 인쇄합니다.

기본 사용법은 다음과 같습니다.

grep something somewhere

또는 더 구체적으로 :

grep [some options] pattern file

매우 간단한 경우에는 모든 파일을 재귀 적으로 검색하기 위해 -r옵션 을 제공합니다 . 대문자 나 소문자를 신경 쓰지 않으면 -i옵션에서 대소 문자를 구분하지 마십시오 .

grep -ri "touppercase()" .

일치하는 부품 만 원하는 경우 -o옵션을 사용하십시오 .

Grep은 정규 표현식을 사용할 수 있으며 큰 매뉴얼이 있습니다 .


2

grep표준 대답 - 반복적으로 또는와 함께 검색 중 -r 플래그를 사용하여가 find(토론과 같은이 사이트에 다른 질문에 예 ,이 일 )

최근에 내가 선호하는 선택은 ack입니다. 컴퓨터에는 설치되어 있지 않지만 Ubuntu에서 apt-get을 사용하여 설치하거나 간단히 다운로드 할 수 있습니다. grep보다 나은 링크, 지침 및 이유는 http://betterthangrep.com/ 에서 확인할 수 있습니다.


1

findgrep

find myproject -name '*.c' -exec grep 'toUpperCase(' {} \; -print

왜 안돼 grep?

grep -r string .현재 디렉토리의 모든 파일을 통해 재귀합니다. 객체 파일이나 다른 이진 파일이 있으면 이진 결과와 다시 일치 할 수 있습니다. 정크. 서브 디렉토리에 fifos 또는 장치 파일이 있으면 알 수 없거나 의도하지 않은 결과가 발생할 수 있습니다.

grep string *.c현재 디렉토리 .c파일 만 검색 합니다.

grep string **/*.c 모든 하위 디렉토리를 검색합니다. 그러나 .c파일 수가 매우 많은 경우 쉘 glob의 최대 확장 수를 초과 할 위험이 있습니다. 또한 확장이 먼저 이루어져야 grep합니다. 이는 시작 하기 전에 전체 트리 순회를 의미 합니다.


0

Grep은 트릭을 수행하지만 약간의 추가 스크립팅은 파일 이름과 참조 된 정확한 행을 찾는 데 도움이됩니다. 그것이 당신이 원하는 것이라면 다음과 같이 잘 작동합니다. 쉘 스크립트로 저장했으며 첫 번째 명령 줄 옵션으로 원하는 값을 전달했습니다.

for i in $(ls)
do
    cat $i 2> /dev/null | grep $1 > /dev/null 2>&1
    STATUS=$?
    if [ $STATUS  -eq 0 ] ; then
        echo $i
        cat $i | grep -n $1
    fi
done

3
grep에는 이미이를 수행하는 -H 옵션이 있습니다. grep -Hn 뭐든지 *
Roy Rico

매일 새로운 것을 배우십시오 .. 감사합니다 @Roy Rico
Tim Brigham

0

"현재 디렉토리에있는 파일 내에 특정 문자열이 있는지 어떻게 알 수 있습니까?"라는 질문에 아무도 대답하지 않은 것이 흥미 롭습니다. 내가 아는 한 파일 그룹에서 일치 항목이 있는지 여부 만 반환하는 grep 옵션이 없습니다. 가장 가까운 옵션은 파일 이름을 나열하는 -l입니다. 지금까지의 사람들 사이에서 가장 가까운 대답은 팀에서 온 것입니다.

#!/usr/bin/bash

for i in $(ls *.c 2> /dev/null)
do
    cat $i 2> /dev/null | grep $1 > /dev/null 2>&1
    STATUS=$?

    if [ $STATUS  -eq 0 ] ; then
        echo "Found"
        exit
    fi
done

echo "Not found"

너무 많은 어려움없이 파일 확장자에 대한 두 번째 인수를 허용하여이 쉘 스크립트를보다 일반적으로 만들 수 있습니다.

더그

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.