2017-10-10 6 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 -R'でファイルを見ることができます。 – 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でを使用して短い)、私はあなたが望むヘッダーを印刷し、sedを使って見つかったマッチの文脈を印刷し続けるよりも、マッチの行だけをgrepします。

関連する問題