2017-10-10 118 views
1

我的意圖:搜索谷底源代碼並找到感興趣的關鍵字。這是爲了自動化一小部分codereview,以找到明顯的編程錯誤,如硬編碼的密鑰和密碼。

目前,我有以下grep命令來搜索槽代碼的某些詞:在處理實際的grep輸出之前打印出匹配的字

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

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命令,但是我無法達到我在這裏描述的結果。

+0

是不是關鍵字着色足夠/更好?如果您將輸出管道輸送到文件並關閉顏色,則仍然可以使用「--color = always」強制輸出,然後使用less less查看該文件。 – randomir

回答

0

我還沒有測試該解決方案,以及更好的(更優雅)解決方案會存在,但這是我會做什麼:

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在簡短),我grep只匹配的行,比我打印你想要的頭,並繼續使用sed打印找到匹配的上下文。

相關問題