在处理实际的grep输出之前打印匹配的单词

时间:2017-10-10 17:39:16

标签: grep formatting ack

我的意图:搜索源代码并找到感兴趣的关键字。这样做是为了自动执行一小部分代码查看,以发现明显的编程错误,如硬编码密钥和密码。

我目前有以下grep命令来搜索某些单词的代码:

while read p; do
    echo "FOUND: ${p}"
    grep -riIn -A 5 -B 5 ${p} "${SEARCHPATH}"
done < "${SEARCHWORDS}"

SEARCHWORDS实际上是一个文件位置,其中包含一个包含搜索词的列表。 SEARCHPATH是grep应搜索的文件夹。 它生成的输出如下:

xo.java-33-    default: 
xo.java-34-      return str;
xo.java-35-    case -4501: 
xo.java-36-      return "Internal error";
xo.java-37-    case -4502: 
xo.java:38:      return "Activation password too long. Limited to 512 characters.";
xo.java-39-    case -4503: 
xo.java-40-      return "CHS key null or empty. Must be a 32 hexadecimal string.";
xo.java-41-    case -4504: 
xo.java-42-      return "Incorrect CHS key length. Must be a 32 hexadecimal string.";
xo.java-43-    case -4505: 

正如你所看到的,它也给出了上下两行,这给了我一些背景,看看它是否是误报。 但我希望得到以下结果:

Found "password" in file "xo.java":

    xo.java-33-    default: 
    xo.java-34-      return str;
    xo.java-35-    case -4501: 
    xo.java-36-      return "Internal error";
    xo.java-37-    case -4502: 
    xo.java:38:      return "Activation password too long. Limited to 512 characters.";
    xo.java-39-    case -4503: 
    xo.java-40-      return "CHS key null or empty. Must be a 32 hexadecimal string.";
    xo.java-41-    case -4504: 
    xo.java-42-      return "Incorrect CHS key length. Must be a 32 hexadecimal string.";
    xo.java-43-    case -4505: 

我希望找到找到的搜索词,因此所有实例都与找到的关键字组合在一起。

如果您对其他工具有任何建议,请随时分享。我尝试了命令ack,但我无法实现我在此描述的结果。

1 个答案:

答案 0 :(得分:1)

我还没有测试过这个解决方案,并且会有一个更好(更优雅)的解决方案,但这就是我要做的:

while read p
do

    # For each found result, do...
    grep -riIn ${p} "${SEARCHPATH} | while read -r line ; do

        # Split array on ':' into an array 
        # element 0 is relative path to file
        # element 1 is line number of match
        IFS=':' read -r -a array <<< "${line}"

        # Print your header
        echo "FOUND '${p}' in '${array[0]}' on line ${array[1]}"
        echo -e "\n"

        # Calculate ranges (number of lines before and after match)
        from_line_nr=$((${array[1]}-5))
        to_line_nr=$((${array[1]}+5))
        # limit ranges if the result is not a valid line number
        # sed can handle numbers bigger than the number of lines in the file
        # so we only need to make sure our lower limit equals to 
        if [ "${from_line_nr}" -lt "1" ]; then from_line_nr=1; fi

        # show lines before and after match using sed
        sed -n "${from_line_nr},${to_line_nr}p" "${array[0]}"

        # Add some white lines to improve readability
        echo -e "\n\n"
    done

done < "${SEARCHWORDS}"

而不是使用参数-A-B(或简称为-C),我只打算匹配的行,而不是打印您想要的标题并继续使用sed打印找到的匹配的上下文。