grep : 파일 이름을 한 번 표시 한 다음 줄 번호로 컨텍스트를 표시하십시오.


16

소스 코드에는 오류 코드가 흩어져 있습니다. grep으로 쉽게 찾을 수 있지만 다음 줄을 따라 출력을 제공 하는 bash 함수 find_code를 실행 하고 싶습니다 (예 :).find_code ####

/home/user/path/to/source.c

85     imagine this is code
86     this is more code
87     {
88         nicely indented
89         errorCode = 1111
90         that's the line that matched!
91         ok this block is ending
92     }
93 }

여기 내가 현재 가지고있는 것입니다 :

find_code()
{
    # "= " included to avoid matching unrelated number series
    # SRCDIR is environment variable, parent dir of all of projects
    FILENAME= grep -r "= ${1}" ${SRCDIR}
    echo ${FILENAME}
    grep -A5 -B5 -r "= ${1}" ${SRCDIR} | sed -e 's/.*\.c\[-:]//g'
}

문제 :

1) 이것은 줄 번호를 제공하지 않습니다

2) .c 소스 파일과 만 일치합니다. .c, .cs, .cpp 및 기타 소스 파일과 일치하도록 sed를 얻는 데 문제가 있습니다. 우리는 C를 사용하므로 단순히 일치하는-또는 : (grep이 각 코드 줄 전에 파일 이름에 추가하는 문자)가 일치 object->pointers하고 모든 것을 엉망으로 만듭니다.

답변:


11

나는 몇 가지를 바꿀 것입니다.

find_code() { 
    # assign all arguments (not just the first ${1}) to MATCH
    # so find_code can be used with multiple arguments:
    #    find_code errorCode
    #    find_code = 1111
    #    find_code errorCode = 1111
    MATCH="$@" 

    # For each file that has a match in it (note I use `-l` to get just the file name
    # that matches, and not the display of the matching part) I.e we get an output of:
    #
    #       srcdir/matching_file.c
    # NOT:
    #       srcdir/matching_file.c:       errorCode = 1111
    #
    grep -lr "$MATCH" ${SRCDIR} | while read file 
    do 
        # echo the filename
        echo ${file}
        # and grep the match in that file (this time using `-h` to suppress the 
        # display of the filename that actually matched, and `-n` to display the 
        # line numbers)
        grep -nh -A5 -B5 "$MATCH" "${file}"
    done 
}

나는 이것을 다시 내 사양으로 조정했다. 나는 단순히 오류 코드를 찾고 싶다. 그래서 MATCH="= ${1}". 또한 --include=*.c --include=*.cpp --include=*.java --include=*.cs검색을 소스 파일로 제한하기 위해 추가 했습니다. 감사!
TravisThomas

1
오 좋은, 기쁜 당신은 잘 당신의 필요 :에 조정 얻을 관리
Drav 슬로 언

3

당신이 사용할 수있는 find두 가지로 -exec첫 번째 만에 검색 예를 들어, 성공할 경우에만 두 번째가 실행됩니다, S .cpp, .c.cs파일 :

find_code() {
find ${SRCDIR} -type f \
\( -name \*.cpp -o -name \*.c -o -name \*.cs \) \
-exec grep -l "= ${1}" {} \; -exec grep -n -C5 "= ${1}" {} \;
}

첫 번째 grep는 패턴이 포함 된 파일 이름을 인쇄하고 두 번째 파일은 해당 파일에서 번호가 매겨진 일치하는 행 + 컨텍스트를 인쇄합니다.

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