grep:显示一次文件名,然后显示带有行号的上下文


16

我们的源代码中遍布错误代码。使用grep可以很容易地找到它们,但是我想要一个find_code可以执行的bash函数(例如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源文件。我无法通过s来匹配.c,.cs,.cpp和其他源文件。但是,我们确实使用C,因此只需匹配-或:(grep在每行代码之前附加到文件名的字符)匹配object->pointers并弄乱所有内容。

Answers:


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 2013年

1
很好,很高兴您能够根据自己的需求进行调整:)
Drav Sloan

3

你可以使用find两个-execS,第二个将被执行只有第一个是成功的,例如,只在搜索.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打印包含模式的文件名,第二个将打印相应文件中匹配的行和上下文(编号)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.