2017-10-10 15 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 어떤 그렙에서 검색 할 폴더입니다 가 생성하는 출력은 다음과 같습니다.

당신이 볼 수 있듯이
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합니다.